Javascript中的异步循环

时间:2018-02-12 19:09:34

标签: javascript

好吧,我有以下代码:

forEach(elements, element =>{
     if(condition){
        doSomething(element)
    } else {
       doSomethingElse(element)
    }
})

我想以异步方式进行此操作,这意味着代码会等到对该元素执行的操作完成后再传递给下一个元素。

感谢您的帮助谢谢!

4 个答案:

答案 0 :(得分:0)

您可以使用async / await。假设您的方法返回Promise,您可以这样做:

const doSomething = () => {
   return new Promise(resolve => { resolve('do something done!') });
}

const doSomethingElse = () => {
   return new Promise(resolve => { resolve('do something else done!') });
}

const arr = [ 1, 2, 3, 4 ];

arr.forEach(async (item, i) => {
   let result = null;
   
   if (i % 2 === 0) { // or any other condition
       result = await doSomething();
   } else {
       result = await doSomethingElse();
   }
   
   console.log(result);
});

答案 1 :(得分:0)

因为你应该避免在for循环中解析promises,正如我在评论中所说,你应该将你的promises存储在一个数组中并在循环之后解决所有这些问题。这应该是这样的:

const promises = [];
elements.forEach(element =>{
     promises.push(condition ? doSomething(element) : doSomethingElse(element));
});

Promise.all(promises).then(...).catch(...);

仅当doSomethingdoSomethingElse是异步函数时,这才是正确的。

答案 2 :(得分:0)

.forEach()已经是同步的(意味着它一次只对一个元素起作用),只需按照此处的描述使用它:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach

您的语法有点偏差,它应该看起来像这样(.forEach()被调用作为它正在运行的数组上的方法):

elements.forEach(element => {
    if (condition) {
        doSomething(element)
    } else {
       doSomethingElse(element)
    }
})

答案 3 :(得分:0)

这是我的尝试,使用递归函数:



var i = 0, n = elements.length;

function doNext() {

    // exit if all elements have been accounted for
    if (i >= n) {
        return;
    }
    
    var element = elements[i];
    i++;
    
    if (condition) {
        doSomething(element).then(doNext);
    } else {
        doSomethingElse(element).then(doNext);
    }
}