Node.js:如何顺序运行异步代码

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)

这里有几个异步的事情发生.对于每个用户,我想找到他们相关的朋友并将他们连接到一个变量.然后,我想检查该用户是否有网站帐户,如果有,请发帖请求并在那里获取一些信息.唯一的问题是,由于代码没有等待回调完成,所有事情都发生了故障.我一直在使用睡眠,但这并没有解决问题,因为它仍然混乱.

我已经研究过异步,但是这些函数是交织在一起而不是真正分开的,所以我不确定它是如何与异步一起工作的.

有什么建议让这段代码顺序运行?

谢谢!

uno*_*obf 5

由于其简单性,我更喜欢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回调.