所以我最近开始使用Node.js,它以我以前见过的方式向我展示了异步代码。然而,我面临的问题是节点节点几乎异步执行函数调用(如果我理解正确的话)。所以我有两个函数A, B
执行一些数据库操作。函数A
需要在B开始之前完成。但是我意识到只是在A
之后调用B
显然不会削减它。所以我认为节点要做的就是回调:)。但我的制作应用可能会有A到Z的系列,所以可能会变得混乱。但是我真的很感激如何在node.js中实现这样的回调。
var http = require('http');
function runAllFunc() {
funcA();
funcB();
};
var server = http.createServer(function(req,res) {
syncFunc();
res.writeHead(200, {'Content-Type':'text/plain'});
res.end('dde');
}).listen(8080);
答案 0 :(得分:4)
如果您只是将这两个函数链接在一起,我会使用传统的回调。但是如果你想要一堆依赖于彼此的各种组合,我会推荐async模块。 (https://github.com/caolan/async)
以下是您如何执行上述示例。
var async = require('async');
var funcA = function() {
console.log("I am function 1");
};
var funcB = function() {
console.log("I am function 2");
};
async.auto({
funcA: function(onADone) {
funcA(); // call your first function here
onADone(); // callback
},
funcB: ['funcA', function(onBDone) {
// second function will not execute until first one is done
// because it is specified above
funcB();
onBDone(); // callback
}],
}, function(err, res) {
if (err) {
console.log("something went wrong " + err);
} else {
console.log("done");
}
});
答案 1 :(得分:3)
有几种方法可以做到这一点。
您可以使用回调。我不知道你的函数在做什么,所以下面的例子都是使用setTimeout的简单异步示例。
function doFirstThing(callback) {
setTimeout(function() {
console.log('First Thing is done');
if (callback) {
callback();
}
}, 1000);
}
function doSecondThing(callback) {
setTimeout(function() {
console.log('Second Thing is done');
if (callback) {
callback();
}
}, 1000);
}
doFirstThing(doSecondThing);
你也可以使用promises,Bluebird(https://github.com/petkaantonov/bluebird)和Q(https://github.com/kriskowal/q)是我想到的两个库。这是Q的一个例子。
var Q = require('q');
function doFirstThing() {
var deferred = Q.defer();
setTimeout(function() {
console.log('First Thing is done');
deferred.resolve();
}, 1000);
return deferred.promise;
}
function doSecondThing() {
var deferred = Q.defer();
setTimeout(function() {
console.log('Second Thing is done');
deferred.resolve();
}, 1000);
return deferred.promise;
}
doFirstThing().then(doSecondThing).done();
另一个选项是async
模块(https://github.com/caolan/async)。这是一个例子:
var async = require('async');
function doFirstThing(next) {
setTimeout(function() {
console.log('First Thing is done');
next();
}, 1000);
}
function doSecondThing(next) {
setTimeout(function() {
console.log('Second Thing is done');
next()
}, 1000);
}
async.series([doFirstThing, doSecondThing]);
当然,有许多不同的方法来设置回调,使用Promise库或使用async的工作流。这些只是几个例子。
编辑:编辑包含引用库的链接。