make for循环等待函数在node.js

时间:2016-09-11 07:28:45

标签: javascript node.js

我是node.js和Javascript世界的新手,我有一个遍历对象数组的循环 在某种情况下,我需要调用一个asnyc工作的函数 并且在功能未完成时停止循环

fucntion foo1(arr){
  for(var i=0 ; arr.length>i ; i++){
        if(i==8){//or any other condition
            doAsyncStuff(hits[i])            
        }
    }
}

function doAsyncStuff(item){
 parser.parseURL(someurl,function(error,result){
  item.someprop=result.someprop;
 })
}

问题是无论我做什么,我似乎无法使函数在结果之前等待它结束并且不更新我需要它更新的项目。 我知道这是一个常见的问题,但我发现的解决方案都没有。 任何帮助都会受到欢迎。 谢谢!

3 个答案:

答案 0 :(得分:1)

在JS中循环和执行异步操作有点棘手。你可以使用@smnbbrv在评论中提到的一个库。但您也可以自己动手,这可以帮助您了解其中一些库的工作原理。

 - (void)tableView:(UITableView *)tableView addSpeciesToFavoriteForCell:(UITableViewCell *)cell 
  {
       NSIndexPath *indexPath = [tableView indexPathForCell:cell];

       // other code 
  }

答案 1 :(得分:0)

如果我理解正确,那么您可以使用Promise链,使用reduce序列化(for循环也可以),类似这样的

function doAsyncStuff(item) {
  return new Promise(resolve => {
    const time = Math.ceil(Math.random() * 2000 + 1000);
    window.setTimeout(() => {
      item.someprop = time;
      resolve();
    }, time);
  });
}

function foo1(arr) {
  return arr.reduce(
    (promise, item, index) => index % 2 === 0 ? promise.then(() => doAsyncStuff(item)) : promise,
    Promise.resolve()
  );
}

const hits = new Array(9).fill().map(() => ({}));
foo1(hits).then(() => {
  console.log(hits);
});

还有Promise.all,你可以使用它(虽然不确定会有多精彩,我不是一个频繁的Promise用户)。

更新:使用Promise.all

function doAsyncStuff(item) {
  return new Promise(resolve => {
    const time = Math.ceil(Math.random() * 2000 + 1000);
    window.setTimeout(() => {
      item.someprop = time;
      resolve();
    }, time);
  });
}

function foo1(arr) {
  return Promise.all(
    arr.map((item, index) => index % 2 === 0 && doAsyncStuff(item))
  );
}

const hits = new Array(9).fill().map(() => ({}));
foo1(hits).then(() => {
  console.log(hits);
});

我仍然没有想出格式化ES6的最佳方法,它总是看起来总是很长。 (个人造型问题):)

答案 2 :(得分:0)

我会使用Bluebird Promises和reducer模式。

var Promise = require('bluebird');

// iterates over the array 'arr' and calls fn
// Myfn repeatedly, optionally passing an initial.
// for the 1st iteration.  For subsequent iterations,
// the value returned by prev invocation of Myfn is passed.    
Promise.reduce(arr, Myfn, someInitialValue);

function Myfn(prev, item) {
   //return a value or a promise.
}

请参阅此处的Reduce文档:http://bluebirdjs.com/docs/api/promise.reduce.html