我尝试使用async在我的Node.js项目中执行一系列事件,如下所示:
server.js:
var express = require('express');
var async = require('async');
...
app.get('/my_page', function (req, res) {
async.series([
function() { console.log("calling foo()"); },
function() { foo(); },
function() { console.log("foo() done"); },
]);
res.render('my_page', {});
}
但是我只获得了第一个控制台输出而且它被卡住.. function()
s之前是function(callback)
s。我以为它正在等待返回一个值,但删除它们并不会改变这种情况。
我做错了什么? (我是Node.js的新手)
感谢您的帮助,
答案 0 :(得分:1)
请阅读文档。每个函数都应该callback
作为参数,并且一旦完成就应该调用callback
,从而告诉async
它是时候转到下一个函数了。所以你应该有类似的东西:
function(callback) {
console.log("calling foo()");
callback();
},
如果其中一个函数出错,请将错误作为第一个参数调用callback
。如果您希望仅在执行最后一个函数后执行res.render('my_page', {});
,请将其包装在函数中并将其作为第二个参数放到async.series
。
当然,如果非函数是异步的,您应该考虑不使用async
。
答案 1 :(得分:1)
首先,我不确定你为什么在这里使用异步,因为你提供给var async = require("async");
function asyncA(callback){
// do something
callback(null, "value-a");
}
function asyncB(callback){
// do something else
callback(null, "value-b");
}
asyncA(function(err, valueA){
console.log(valueA); // "value-a"
asyncB(function(err, valueB){
console.log(valueB); // "value-b"
});
});
async.series([asyncA, asyncB], function(err, results){
console.log(results); // ["value-a", "value-b"]
}
函数的所有函数都不是异步的。
async.series对于连续调用多个异步函数并避免callback hell非常有用。
async
我建议对异步函数和回调进行一些阅读,并考虑是否真的需要{{1}}库。我推荐You Don't Know JS chapter on asynchronous javascript和整个系列:)