2017-05-12 50 views
1

我有一個由Promise函數包圍的文件文件。我在這個函數中有一個數據庫操作,這也需要另一個承諾。請檢查下面我如何在node.js的另一個promise函數中嵌套promise?

var p ; 
var ted = dep.map(function(name){ 

return new Promise(function(resolve,reject){ 
    /*..list of other tasks*/ 
    for(int i = 0 ;i<3<;i++){   
     p = Promise.resolve(savemongo(myobj,str)); // this is async function. How do I wait till this operation is complete and then move to next 
    } 
    resolve(); 

)}; 

代碼現在,我一直在使用下面的代碼

module.exports = Promise.all([ted,p]); 

我怎麼等到我savetomongodb功能齊全該模塊導出到不同的文件

林。

+0

'承諾.all'只有一個參數。順便說一句,請正確地格式化/縮進您的代碼。 –

+0

@ karthik006你無法專門請人來幫助你。堆棧溢出是一個社區,任何人都可以回答並詢問。你不會問一個特定的人來幫助你... – Li357

+0

對不起,我已經更新了上面的問題 – karthik006

回答

1

圍繞整個事情由一個new Promise電話沒有任何幫助。在它裏面,你仍然有回撥地獄。不,把Promise.resolve()扔在一個不返回任何東西的函數也沒有幫助。

您需要promisify異步基元,即異步的最小部分。在你的情況,這是distance.matrix和蒙戈的connect + insert

function getMatrix(m, o, d) { 
    return new Promise(function(resolve, reject) { 
     m.matrix(o, d, function(err, distances) { 
      if (err) reject(err); 
      else  resolve(distances); 
     }); 
    }); 
} 

function save(url, store, k) { 
// cramming connect+insert in here is not optimal but let's not get into unnecessary detail 
    return new Promise(function(resolve, reject) { 
     MongoClient.connect(url, function(err, db) { 
      if (err) 
       reject(err); 
      else 
       db.collection(k).insert(store, function(err, results) { 
        if (err) reject(err); 
        else  resolve(results); 
        db.close(); 
       }); 
     }); 
    }); 
} 

現在我們有了這些,我們實際上可以使用它們,我們的承諾,組合成你實際上是在尋找:

module.exports = Promise.all(dep.map(function(name) { 
    distance.departure_time(name); 
    return getMatrix(distance, origins, destinations).then(function(distances) { 
     if (!distances) throw new Error('no distances'); 
     var promises = []; 
     if (distances.status == 'OK') { 
      for (var i=0; i < origins.length; i++) { 
       for (var j = 0; j < destinations.length; j++) { 
        var origin = distances.origin_addresses[i]; 
        var destination = distances.destination_addresses[j]; 
        if (distances.rows[0].elements[j].status == 'OK') { 
         var duration = distances.rows[i].elements[j].duration_in_traffic.value; 
         var myobj = { 
          destination: destination, 
          departure_time: name, 
          duration: duration 
         }; 
         var str = destination.replace(/[,\s]+/g, ''); 
         promises.push(save(url, myobj, str)); 
//         ^^^^^^^^^^^^^^^^^^^^^ 
        } 
       } 
      } 
     } 
     return Promise.all(promises); // now wait for all save results 
    }); 
})); 
+0

'throw new Error('no distance')'和'return Promise.reject(new Error('no distance'))''之間有什麼區別?應該將'.catch()'鏈接到'return Promise.all(promises)'? – guest271314

+0

非常感謝@Bergi。你拯救了我的一天。我也不明白你使用Promises數組來推動保存功能的部分。你可以請澄清它,如果你不介意 – karthik006

+0

1)[無差別](http://stackoverflow.com/q/33445415/1048572)。 2)catch應該被鏈接到你想要處理錯誤的地方。 (將它鏈接到'Promise.all(promises)'將從'save'調用中捕獲)。 3)不推動'save'函數,*調用'save'函數並將返回的promise放入該數組中。就像你最初使用'dep.map(...)' – Bergi

相關問題