use*_*037 4 javascript asynchronous node.js
我有这段代码
User.find({}, function(err, users) {
for (var i = 0; i < users.length; i++) {
pseudocode
Friend.find({
'user': curUser._id
}, function(err, friends) * * ANOTHER CALLBACK * * {
for (var i = 0; i < friends.length; i++) {
pseudocode
}
console.log("HERE I'm CHECKING " + curUser);
if (curUser.websiteaccount != "None") {
request.post({
url: 'blah',
formData: blah
}, function(err, httpResponse, body) { * * ANOTHER CALLBACK * *
pseudocode
sendMail(friendResults, curUser);
});
} else {
pseudocode
sendMail(friendResults, curUser);
}
});
console.log("finished friend");
console.log(friendResults);
sleep.sleep(15);
console.log("finished waiting");
console.log(friendResults);
}
});
Run Code Online (Sandbox Code Playgroud)
这里有几个异步的事情发生.对于每个用户,我想找到他们相关的朋友并将他们连接到一个变量.然后,我想检查该用户是否有网站帐户,如果有,请发帖请求并在那里获取一些信息.唯一的问题是,由于代码没有等待回调完成,所有事情都发生了故障.我一直在使用睡眠,但这并没有解决问题,因为它仍然混乱.
我已经研究过异步,但是这些函数是交织在一起而不是真正分开的,所以我不确定它是如何与异步一起工作的.
有什么建议让这段代码顺序运行?
谢谢!
由于其简单性,我更喜欢q https://www.npmjs.com/package/promise的promise模块
var Promises = require('promise');
var promise = new Promises(function (resolve, reject) {
// do some async stuff
if (success) {
resolve(data);
} else {
reject(reason);
}
});
promise.then(function (data) {
// function called when first promise returned
return new Promises(function (resolve, reject) {
// second async stuff
if (success) {
resolve(data);
} else {
reject(reason);
}
});
}, function (reason) {
// error handler
}).then(function (data) {
// second success handler
}, function (reason) {
// second error handler
}).then(function (data) {
// third success handler
}, function (reason) {
// third error handler
});
Run Code Online (Sandbox Code Playgroud)
如你所见,你可以永远这样继续下去.您也可以从异步处理程序返回简单值而不是promises,然后将这些值简单地传递给then
回调.