【问题标题】:Resolving promises inside for loop在 for 循环中解决承诺
【发布时间】:2018-10-28 09:01:00
【问题描述】:

我正在尝试使用 for 循环读取 JSON 对象,以格式化 JSON 数据并将其发送回客户端,方法是将格式化的响应放入模型对象中。

在 for 循环中,我根据几个条件处理两个承诺。有两个函数,每个函数都有一个返回的承诺。在所有的承诺都解决后,我怎样才能得到我的最终数据?提前致谢。

for (var i = 0, i<jsonData.length; i++){
   if(someCOndition){
       getSomeData().then(function(data){
          //some operation using data
       })
   }
  if(someOtherCOndition){
       getSomeOtherData().then(function(data){
          //some operation using data
       })
   }
}

【问题讨论】:

  • 您只是想知道循环中的所有承诺何时完成,还是想从所有承诺中收集一些数据并在最后获得所有这些数据?你的代码有点太多的伪代码,我们无法理解这段代码的全部目标是什么。

标签: javascript node.js promise


【解决方案1】:

Promise.all([ promise1, promise2 ]) (Promise.all() on MDN) 在标准 JS Promises (ES2015+) 的情况下。它返回一个新的 Promise,一旦所有通过的 Promise 得到解决,它就会被解决。但请注意 - 当至少一个承诺被拒绝时,它会立即被拒绝(它不会等待任何其他承诺)。

【讨论】:

    【解决方案2】:

    你可以这样做;

    var promises = [],
      JSONData_1 = ["chunk_11","chunk_12","chunk_13"],
      JSONData_2 = ["chunk_21","chunk_22","chunk_23"],
     getJSONData = (b,i) => new Promise((resolve,reject) => setTimeout(_ => b ? resolve(JSONData_1[i])
                                                                              : resolve(JSONData_2[i]),1000));
    
    for (var i = 0; i < JSONData_1.length; i++){
       if(Math.random() < 0.5) promises.push(getJSONData(true,i));
       else promises.push(getJSONData(false,i));
    }
    Promise.all(promises)
           .then(a => console.log(a));

    【讨论】:

      【解决方案3】:

      您可以使用 jQuery.when()。

        var deferredList = [];
          for (var i = 0, i<jsonData.length; i++){
             if(someCOndition){
      
               deferredList.push(getSomeData().then(function(data){
               //some operation using data
               }))
              }
         if(someOtherCOndition){
      
             taskList.push(getSomeOtherData().then(function(data){
              //some operation using data
             }))
          }
         }
       JQuery.when(taskList).done(function(){
            // final to do..
       }).fail(){
          // even if single one fails ! be aware of this
         }
      

      jQuery.when() MDN

      【讨论】:

      • 解决了我的问题。谢谢!!
      【解决方案4】:

      您可以通过多种方式做到这一点。如果需要,我们还可以使用 for of 循环和 async..await 来在循环时同步获取结果。像这样的:

      function downloadPage(url) {    
          return Promise.resolve('some value'); 
      }
      
      async function () {    
          for(let url of urls) {
             let result = await downloadPage(url);
             // Process the result 
             console.log(result);    
          } 
      }
      

      【讨论】:

        【解决方案5】:

        你可以做这样的事情..

        var arr=[],arr2=[];
        for (var i = 0, i<jsonData.length; i++){
           if(someCOndition){
               //push onto the array inputs for getSomeData()
               arr.push(jsonData[i]);
           }
          if(someOtherCOndition){
               arr2.push(jsonData[i]);
           }
        }
        
        processArr(0);
        processArr2(0);
        
        function processArr(idx){
            if (idx>=arr.length) {
                //done
            }
            else {
                getSomeData().then(function(data){
                  // some operation using data
                  // optionally store in a results array
        
                  // recurse
                  processArr(idx+1)
        
               })
            }
        }
        
        function processArr2(idx){
            if (idx>=arr2.length) {
                //done
            }
            else {
                getSomeotherData().then(function(data){
                  // some operation using data
        
                  // recurse
                  processArr2(idx+1)
               })
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-12-11
          • 2018-03-13
          • 1970-01-01
          • 2015-05-05
          • 2023-03-17
          • 2015-11-13
          • 2021-08-03
          • 1970-01-01
          相关资源
          最近更新 更多