2016-05-06 68 views
1

在我的「gulpfile.js」的「myMethod」方法中,我想要創建多個承諾。數量取決於數組大小(方法參數)。當我打電話給我的方法時,我想確保所有的承諾都在我繼續之前完成。我寧願在所有承諾未兌現之前都回來。多個承諾的一個承諾 - 併發問題

請看看最後五行代碼。

依賴

var promiseAll = require('gulp-all'); 
var del = require('del'); 
var deleteEmpty = require('delete-empty'); 

gulp-all | del | delete-empty

helper方法

var oneForAllPromises = function(promises){ 
    var promAll = promiseAll(promises); 
    promAll.then(function(param) { 
     console.log('foo'); 
    }, function(err) { 
     console.error('foo'); 
    }); 
    return promAll; 
} 

有問題的代碼

var myMethod = function(array1, array2){ 
    var promise = del(array1, {force: true}); 
    promise.then(paths => {console.log('foo');}); 

    var promises = []; 
    promise.then(()=>{ 
     for(var i=0; i<array2.length; i++){ 
      promises[i] = new Promise(function(resolve, reject) { 
       deleteEmpty(array2[i], {force: true}, 
        function(err, deleted){ 
         if(err){ 
          console.log('foo'); 
          reject 
         }else{ 
          console.log('foo'); 
          resolve 
         } 
        } 
       ); 
      }); 
     } 
    }); 

    // PROBLEM: Returns empty promises array 
    console.log("promiesesLENGTH: "+promises.length); // promiesesLENGTH: 0 

    // Create one promise for all the promises 
    return oneForAllPromises(promises); 
} 

回答

3

在執行console.log的時候,第一個應許promise = del(array1, {force: true});尚未完成,因此所有代碼在then是尚未執行。這就是爲什麼你的承諾是空的。

您可以簡單地返回一個接着又承諾:

var myMethod = function(array1, array2){ 
    var promise = del(array1, {force: true}); 

    return promise.then(() => { 
     return Promise.all(array2.map(array2value => { 
      return new Promise(function(resolve, reject) { 
       deleteEmpty(array2value, {force: true}, (err, deleted) => { 
        if (err) { 
         reject(err); 
        } else{ 
         resolve() 
        } 
       }); 
      }); 
     } 
    }); 
} 
+0

什麼觸發一個承諾開始呢? – Sailcomp

+1

當promise的異步操作完成時調用傳遞給promise的'then'函數,並且_never_將被同步調用。你似乎對異步工作方式感到困惑。這裏有一個關於這個主題的好的指南:https://github.com/getify/You-Dont-Know-JS/tree/master/async%20%26%20performance – JLRishe

+0

「then」一詞是爲了這裏的語言不是對代碼的引用。對困惑感到抱歉。代碼中的「then」意味着什麼意思應該清楚。但是,爲什麼你寫下「第一個承諾......尚未開始」呢?我認爲它是在它寫入的位置開始的,但是在執行數組長度的控制檯日誌時肯定沒有完成。感謝您的指導。 – Sailcomp