Node.js中迭代的异步问题

时间:2013-01-11 21:10:48

标签: javascript node.js asynchronous

我发现自己遇到了遍历数组的问题,触发了每个项目的异步操作,这些项​​目使用我再次迭代的数组调用我的回调...当然在进入下一个项目之前,你需要等待以前完成。如果在处理项目时发生错误,则必须停止并退出所有封闭循环。

我为处理这些情况而编写的代码很容易编写但不易于阅读/维护。为了完整解决这个问题,我目前正在使用我编写的方法,如下所示:

iterate(items, item_callback, ended_callback);

其中item_callback如下所示:

function(item, next_item, stop) {

    //do your stuff with `item` here...

    //return next_item() to go forward
    //return stop() to break
}

我想知道我可能错过了在node.js中迭代的更好技巧。

示例时间:

User.find(function(err, users) {
    //iterate through users: how?
    //first attempt: for
    for(var i in users) {
        //simple stuff works here... but if I call something async... what do I do?
        //like iterating through friends
        User.find({friend:users[i]._id}, function(err, friends) {
            if(err) {
                 //handle error: how is best to do this?
            }
            //this might end after the next user is selected... and might break things
        });
    }
});

TL; DR:如何在node.js中进行迭代,以便它可以同时使用异步代码和经典同步代码?

P.S。:我确信有些用户会在使用async模块时回答一些问题。我知道。我不喜欢我的代码在使用时的样子。与我目前的解决方案相比,它的可维护性更低。我需要更好的东西。

2 个答案:

答案 0 :(得分:1)

有很多node.js flow control libraries用于处理异步操作。他们都有略微不同的方法和句法糖,但async可能是最受欢迎的。我更喜欢Step因为它的功率重量比。 :)

答案 1 :(得分:0)

如果我正确使用你的例子就是猫鼬用法。请参阅以下基于承诺的解决方案:Node.js deferred promisify + mongoose