这个问题可能会重复。我是node.js和异步编程回文的新手。我在谷歌上搜索过很多例子,但是我还是有点困惑。
好的,通过google搜索,我了解到所有回调都是异步处理的。例如,让我们从 api中获取读取文件函数
Fs.readFile(文件名,选项,回调) //回调将异步处理fs.readFileSync(文件名,选项)
var fs = require('fs');
fs.readFile('async-try.js' ,'utf8' ,function(err,data){
console.log(data); })
console.log("hii");上面的代码将首先打印hii,然后打印文件的内容。
所以,我的问题是:
发布于 2013-06-13 15:01:28
所有回调都是异步处理的吗?
不一定。通常,它们是这样的,因为在NodeJS中,它们的目标是在长时间运行的任务完成后(通常是IO操作)恢复函数的执行(一个延续)。但是,您自己编写了一个同步回调,因此正如您所看到的,它们并不总是异步的。
下面的代码不是异步的,为什么和如何使它?
如果希望异步调用回调,则必须告诉Node“有时间执行”。换句话说,您将回调的执行推迟到稍后Node完成正在执行的执行时执行。
function compute(callback){
for (var i = 0; i < 1000; i++);
// Defer execution for later
process.nextTick(function () { callback(i); });
}输出:
hii
value of i is:1000有关异步回调工作方式的更多信息,请阅读这篇博文解释了process.nextTick是如何工作的。
发布于 2013-06-13 14:55:09
不,这是一个常规的函数调用。
除非强制回调,否则回调不会是异步的。一种很好的方法是在0毫秒的setTimeout内调用它。
setTimeout(function() {
// Am now asynchronous
}, 0);通常,当调用函数涉及在服务器上发出新请求(例如打开一个新文件)时,回调是异步的,在等待它完成时停止执行是没有意义的。
发布于 2013-06-13 15:15:56
下面的代码不是异步的,为什么和如何使它?
function compute(callback){
for(var i =0; i < 1000 ; i++){}
callback(i);
}我将假设您的代码试图说,“我需要执行1000次,然后在一切都完成时使用我的回调”。
即使您的for循环在这里也不能工作,因为想象一下:
function compute(callback){
for(var i =0; i < 1000 ; i++){
DatabaseModel.save( function (err, result) {
// ^^^^^^ or whatever, Some async function here.
console.log("I am called when the record is saved!!");
});
}
callback(i);
}在这种情况下,for循环将执行保存调用,而不是等待它们完成。因此,在您的示例中,您可能得到类似于(取决于时间)的输出。
I am called when the record is saved
hii
I am called when the record is saved
...如果您的计算方法只在所有事情都完成(所有1000个记录都保存在数据库中)时才调用回调,我将查看异步 Node包,它可以为您轻松地完成此任务,和为您将在Node中遇到的许多异步问题提供了模式。
因此,您可以重写计算函数如下:
function compute(callback){
var count = 0
async.whilst(
function() { return count < 1000 },
function(callback_for_async_module) {
DatabaseModel.save( function (err, result) {
console.log("I am called when the record is saved!!");
callback_for_async_module();
count++;
});
},
function(err) {
// this method is called when callback_for_async_module has
// been called 1000 times
callback(count);
);
console.log("Out of compute method!");
}注意,计算函数的回调参数将在console.log("Out of compute method")之后的某个时候被调用。这个函数现在是异步的:应用程序的其余部分不等待compute完成。
https://stackoverflow.com/questions/17090162
复制相似问题