Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js中迭代的异步问题_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript Node.js中迭代的异步问题

Javascript Node.js中迭代的异步问题,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我发现自己遇到了迭代数组的问题,为调用我的回调的每个项目触发异步操作,我再次迭代数组。。。当然,在进入下一项之前,您需要等待上一项完成。如果在处理项目时发生错误,则必须停止并退出所有封闭循环 我为处理这些情况而编写的代码很容易编写,但不容易阅读/维护。为了完整地回答这个问题,我目前正在使用我编写的方法,如下所示: iterate(items, item_callback, ended_callback); function(item, next_item, stop) { //do

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

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

iterate(items, item_callback, ended_callback);
function(item, next_item, stop) {

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

    //return next_item() to go forward
    //return stop() to break
}
其中,item_回调如下所示:

iterate(items, item_callback, ended_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中进行迭代,使其能够同时使用异步代码和经典同步代码


注意:我相信一些用户在使用
async
模块的过程中会回答一些问题。我知道。我不喜欢我的代码在使用时的样子。它的可维护性甚至不如我当前的解决方案。我需要更好的东西。

处理异步操作有很多方法。它们的方法和语法都略有不同,但是
async
可能是最流行的。我更喜欢
Step
,因为它的功率重量比:

如果我理解正确,你的例子就是猫鼬的用法。请参阅以下基于承诺的解决方案:

谢谢您的链接<代码>每个似乎更接近我认为可维护的代码。但这是主观的。但你的回答引发了另一个小问题。node.js社区还没有找到它的迭代器?是的。这就是我要说的。现在必须等待协同路由成为node.js的一部分。您可以看到为什么我们需要在这里等待:这是一个关于串联、并联和有限并联模式的流控制的非常好的讨论:顺便说一句,可能是Did find的重复。当然是重复的。