异步函数不在forEach循环内等待

时间:2017-08-01 14:43:18

标签: javascript foreach async-await


我在forEach循环中调用了我的异步函数,如下所示:

foo {
    list.forEach(function( field ) {        
        populateValues( field );
    });

    // here my list is returned incomplete
    return list;
}

populateValues = async function ( field ) {
    if ( field.someProp === true ) {
        fields.val = await somePromise();
    }
}

somePromise = function() {
    return new Promise( resolve => {
        fetchMyAPIExample().then( function( value ) {
            resolve( value );
        }
    }
}

populateValues()正确地等待我的承诺,但是foo()不会等待populateValues返回列表,所以它返回我的列表不完整。

2 个答案:

答案 0 :(得分:6)

您可能也想等待那里,这对于forEach不起作用但是for..of:

async function foo(){
  for(var field of list){        
    await populateValues( field );
  }
  return list
}

或者如果你想启用赛车:

function foo(){
  return Promise.all(
    list.map( field => populateValues( field ))
  ).then(_=>list);
}

答案 1 :(得分:3)

由于对 populateValues()的每个函数调用都是异步的,函数 foo 不会等待返回列表对象。

你可以让 foo 等待 populateValues 的结果来获得你期望的回应。