这是我第一次尝试使用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
}
答案 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
})