如何使用promise inisde forEach来检查forEach是否完成?

时间:2017-08-29 16:43:48

标签: javascript node.js foreach promise

这是我第一次尝试使用promises。完成forEach后,我想调用另一个函数进行进一步处理,forEach只打印一次insertIDBEvents,下一次调用不打印。

forEach使用承诺的正确方法是什么?

nodeCtrl.js

    var ctr = 0;
    var insertIDBEvents = [];
    data.forEach(function(element, index, array) {
        event = JSON.parse(element.variables.event.value);
        if (typeof element.variables.caseIdFound !== 'undefined') {
            //asynchronous(function(data){
            Promise.all(array)
                .then(function(element) {
                    ctr++;
                    console.log("caseIdFound boolean", element.variables.caseIdFound.value);
                    insertIDBEvents.push(element);
                    console.log(insertIDBEvents);
                    if (ctr === array.length) {
                        console.log('IDBinsert', JSON.stringify(insertIDBEvents));
                    anotherFunction(insertIDBEvents)
                    }
                })

        }

    });

anotherIDBEvents (data) {
   // do something with data
}

3 个答案:

答案 0 :(得分:1)

Promise.all与迭代一起使用的方法是将元素数组映射到一个promises数组中,这些promises执行相对于这些元素的必要异步操作,然后将promise数组传递给Promise.all

所以这是一个大致的想法:

Promise.all(
  arrayOfElements.map(
    element => (
      functionThatReturnsAPromise(element)
    )
  )  
)
.then(results => {
  // ...
})

答案 1 :(得分:0)

重新排列代码,以便Promise.all在外面。此外,您的数组的值必须是Promises。

这很难说,因为上面的代码显然不起作用,但我认为你想要映射数据数组以使每个元素运行一个promise,然后转储所有把它变成Promise.all

这样的事情:

var ctr = 0;
var insertIDBEvents = [];

Promise.all(data.map(element => {
  event = JSON.parse(element.variables.event.value);

  if (typeof element.variables.caseIdFound !== 'undefined') { 
    ctr++;
    console.log("caseIdFound boolean", element.variables.caseIdFound.value);
    insertIDBEvents.push(element);
    console.log(insertIDBEvents);
    if (ctr === array.length) {
      console.log('IDBinsert', JSON.stringify(insertIDBEvents));
      anotherFunction(insertIDBEvents)
    }
  }
})).then(() => {
  anotherIDBEvents(data);
});

答案 2 :(得分:0)

您可能希望首先构建promise数组,使用条件进行过滤,然后将数组传递给Promise.all(),或者另一种常见方法是构建元素数组并使用Promise.map()(如果lib你正在使用支持它),为每次迭代执行相同的代码,而不是为每个元素实例化相同的promises。

const anotherFunction = element => {
  // do something with data
  return element
}

const elements = data.map(element => {
  return !!element.variables.caseIdFound
})

Promise.map(elements, element => {
  return anotherFunction(element)
}).then(res => {
  //handle resolution
}).catch(err => {
  //handle exceptions
})