【问题标题】:JavaScript wait for backend response while iterating arrayJavaScript 在迭代数组时等待后端响应
【发布时间】:2018-10-16 21:24:25
【问题描述】:

我正在使用 javascript,我希望在迭代下一项之前等待其他函数响应。

这是所需的行为:


这是我的代码:

let lista = [1,2,3,4]
console.log('Iteracion de la lista')
async function procesarLista(array){
    for(const item of array){
        console.log('-->START indice: ' + item)
        //Simulate delay (for each iteration) of backend response
        setTimeout(function(){
            console.log('....waiting.... for : ' + item );
        }, 2500);
        console.log('-->FINISH indice: ' + item)
    }
    console.log('Done');
 }
 //Execute:
 procesarLista(lista);

这是错误的结果:

【问题讨论】:

    标签: javascript arrays foreach async-await ecmascript-5


    【解决方案1】:

    for 循环内的每次迭代中尝试await 一个Promise:

    let lista = [1, 2, 3, 4]
    console.log('Iteracion de la lista')
    async function procesarLista(array) {
      for (const item of array) {
        await new Promise((resolve) => {
          console.log('-->START indice: ' + item)
          //Simulate delay (for each iteration) of backend response
          setTimeout(function() {
            console.log('....waiting.... for : ' + item);
            resolve();
          }, 500);
        });
        console.log('-->FINISH indice: ' + item)
      }
      console.log('Done');
    }
    //Execute:
    procesarLista(lista);

    for..of 需要再生器运行时。如果你没有那个,那么你可以使用reduce,但你必须await循环内最后一次迭代的分辨率await记录之前的最终承诺@ 987654328@:

    let lista = [1, 2, 3, 4]
    console.log('Iteracion de la lista')
    async function procesarLista(array) {
      await new Promise ((outerResolve) => {
        array.reduce(async (lastPromise, item) => {
          await lastPromise;
          await new Promise((resolve) => {
            console.log('-->START indice: ' + item)
            //Simulate delay (for each iteration) of backend response
            setTimeout(function() {
              console.log('....waiting.... for : ' + item);
              resolve();
            }, 500);
          });
          console.log('-->FINISH indice: ' + item)
        }, Promise.resolve());
      });
      console.log('Done');
    }
    procesarLista(lista);

    【讨论】:

    • 谢谢,但我还有另一个错误消息:regeneratorRuntime 未定义
    • 查看编辑 - 如果你不能使用for..of,那么如果你仍然想使用async/await,那么使用.reduce
    【解决方案2】:

    你也可以使用回调:

    let lista = [1,2,3,4]
    console.log('Iteracion de la lista')
    function procesarLista(array , callback){
      let isProcessDone = false;
      for(const item of array){
    
        //Simulate delay (for each iteration) of backend response
        setTimeout(function(){
                console.log('-->START indice: ' + item)
            console.log('....waiting.... for : ' + item );
            console.log('-->FINISH indice: ' + item)
            callback('Done')
        }, 2500);
    
      }
    }
    //Execute:
    procesarLista(lista , function(result){
       // Do Something after each job is done
    });
    

    这将是输出:

    Iteracion de la lista
    -->START indice: 1
     ....waiting.... for : 1
    -->FINISH indice: 1
    -->START indice: 2
     ....waiting.... for : 2
    -->FINISH indice: 2
    -->START indice: 3
     ....waiting.... for : 3
    -->FINISH indice: 3
    -->START indice: 4
     ....waiting.... for : 4
    -->FINISH indice: 4
    

    这是一个例子:

    https://jsfiddle.net/op98bpka/1/

    【讨论】:

      【解决方案3】:

      也许这对你有用

      lista = [1, 2, 3, 4];
      
      async function procesarItem(array, id) {
        if (id >= array.length) {
          console.log('Done');
          return;
        }
        console.log('-->START indice: ' + id);
        setTimeout(function () {
          console.log('-->FINISH indice: ' + id)
          procesarItem(array, id + 1);
        }, 2500);
        console.log('....waiting.... for : ' + id);
      }
      
      //Execute:
      procesarItem(lista, 0);

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-10-30
        • 2021-08-28
        • 1970-01-01
        • 1970-01-01
        • 2020-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多