Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 当并非所有数组元素都将被处理时,是否使用索引forEach函数?_Javascript_Arrays_Node.js_Indexing_Foreach - Fatal编程技术网

Javascript 当并非所有数组元素都将被处理时,是否使用索引forEach函数?

Javascript 当并非所有数组元素都将被处理时,是否使用索引forEach函数?,javascript,arrays,node.js,indexing,foreach,Javascript,Arrays,Node.js,Indexing,Foreach,我在node.js服务器中有一个forEach函数,如下所示: fruits.forEach(function(fruit, index, fruits){ function ONE (response){ function TWO (response){ function THREE (response){ if (index === fruits.length){ DoAnotherFunction();

我在node.js服务器中有一个forEach函数,如下所示:

    fruits.forEach(function(fruit, index, fruits){

      function ONE (response){

      function TWO (response){

      function THREE (response){

      if (index === fruits.length){
      DoAnotherFunction();
               }
            })
         })
      })
    })
我只需要在处理完水果数组中的每个“水果”后才调用DoAnotherFunction

但是问题是,只有一些水果会通过函数1、2和THRE,其他水果可能只通过函数1和2,其他水果可能不会通过任何函数(由于函数中的操作不同)


我如何确保只有forEach通过1、2和3处理完每个结果后(或者也尝试过)才会调用DoAnotherFunction

您的问题应编辑为每个人都能理解的普通问题。但从我能收集到的信息来看,你在寻找这样的东西:

这有什么用?我们使用异步来控制我们的函数调用

1) 对于
fruits
中的每个
fruits
我们执行
函数(项,回调){}

2) 在我们用水果做了
任何事之后,我们称之为
回调


3) 当所有水果项目都调用回调时,我们执行
DoAnotherFunction()

像Ferry一样,我会使用上面提到的优秀异步库

下面是代码(请记住
npm安装async
):

var async=require('async');
//定义一些要处理的水果。
风险值=[
{name:“Banana”,doesOne:true,doesTwo:true,doesThree:true},
{name:“Orange”,doesOne:false,doesTwo:true,doesThree:true},
{name:“Apple”,doesOne:false,doesTwo:false,doesThree:false},
{name:“Grape”,doesOne:false,doesTwo:true,doesThree:false}
];
//您想要做的事情(异步)。。。
var doItem=函数(项、索引、操作、回调){
setTimeout(函数(){
log(“执行的异步操作”,操作,“关于项”,索引,项.name);
回调();
},Math.floor(Math.random()*2000));
};
//确定所需的呼叫。
变量队列=[];
水果.forEach(功能(项目、索引){
若有(项目doesOne){
push(函数(回调){
doItem(项,索引,1,回调);
});
}
如果(项目doesTwo){
push(函数(回调){
doItem(项,索引,2,回调);
});
}
如果(第三项){
push(函数(回调){
doItem(项,索引,3,回调);
});
}
});
//处理它们。
async.parallel(队列、函数(){
console.log(“完成”,queue.length);
});
log(“启动”);
上面的代码可以更加紧凑,但为了清晰起见,它是冗长的。其实质是:

  • 设置一些示例(水果)数据,并为三个可能的操作中的每一个设置标志

  • 定义在传递详细信息时可以执行这些操作的函数。这个函数还获得了一个回调来通知何时完成(我已经为每个操作模拟了一个很小的随机运行时延迟)

  • 构建一个数组,其中包含所有水果所需的所有操作以及它们设置的所有标志。这些操作由一个匿名函数组成,这些匿名函数调用刚刚定义的操作函数,然后通过回调链在完成操作时给出建议。这是推动呼叫,而不是结果

  • 要求异步模块并行执行它们。当所有人都发送了回调后,异步库将发出最后的通知

  • 最终输出与此类似:

    Started.
    Performed async action 2 on item 1 Orange
    Performed async action 3 on item 0 Banana
    Performed async action 2 on item 0 Banana
    Performed async action 3 on item 1 Orange
    Performed async action 1 on item 0 Banana
    Performed async action 2 on item 3 Grape
    Done 6
    
    编辑:
    请注意,我假设异步是节点,您通常不希望阻塞调用。如果同步正常,您可能只需要查看
    forEach
    循环,不必排队,直接呼叫即可。

    您尝试过运行此代码吗?您可以随时跟踪函数的运行时间,如果满足该条件,请运行
    DoAnotherFunction
    I已运行此代码。你能解释一下答案吗?
    index
    永远不会等于
    forEach
    中的
    fruits.length
    forEach
    中的
    长度。是的,我在这个网站上键入时出错,代码实际上是fruits.length-1你在循环中。我不知道fruit将触发每个函数的条件是什么,但是--设置一个变量,比如VARx=0;。一个()运行,增量为x。x现在是1。如果x==1,TWO(),则将x增加到2以显示TWO()已运行。Etc Etc,那么如果(x==3){dootherfunction()
    
    Started.
    Performed async action 2 on item 1 Orange
    Performed async action 3 on item 0 Banana
    Performed async action 2 on item 0 Banana
    Performed async action 3 on item 1 Orange
    Performed async action 1 on item 0 Banana
    Performed async action 2 on item 3 Grape
    Done 6