2

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

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

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 中进行迭代,以便它同时适用于异步代码和经典同步代码?

PS:我相信有些用户会在使用async模块时回答一些问题。我知道。我不喜欢我的代码在使用时的样子。它甚至比我当前的解决方案更难维护。我需要更好的东西。

4

2 回答 2

1

有大量用于处理异步操作的node.js 流控制库。它们都有略微不同的方法和语法糖,但 async可能是最受欢迎的。我更喜欢Step它的功率重量比。:)

于 2013-01-11T21:16:53.443 回答
0

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

于 2013-01-23T11:20:15.303 回答