【问题标题】:Async issues with iteration in Node.jsNode.js 中迭代的异步问题
【发布时间】:2013-01-23 19:20:15
【问题描述】:

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

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

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 模块时回答一些问题。我知道。我不喜欢我的代码在使用时的样子。它甚至比我当前的解决方案更难维护。我需要更好的东西。

【问题讨论】:

标签: javascript node.js asynchronous


【解决方案1】:

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

【讨论】:

  • 感谢您的链接。 each 似乎更接近我认为的可维护代码。但这是主观的。但你的回答引发了另一个小问题。 node.js 社区还没有找到它的迭代器?
  • 是的。这就是我要说的。现在必须等待协程成为 node.js 的一部分。你可以在这里看到为什么我们需要真正等待:news.ycombinator.com/item?id=1549168
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2016-07-10
    • 2013-05-07
    • 2023-03-04
    • 2022-01-22
    • 2013-11-27
    • 2013-08-04
    • 2013-03-25
    • 2015-02-19
    • 1970-01-01
    相关资源
    最近更新 更多