2017-09-27 76 views
0
//pseudo code 
function f2(){ 
    var deferred = Q.defer(); 
    Q.all(chunked.map(f12)).then(function(results){ 
     Q.all(results.map(f13)).then(function(){ 
      //f13 returns promise that return value 
      deferred.resolve(); 
     }); 
    }); 
    return deferred.promise; 
} 

f2().then(function(){ 
    console.log("end"); 
}); 

所以我已經發揮功能,我知道「反模式」,但我有特定的功能,需要被緩衝。我有兩個嵌套的q.all函數。所有工作都很好,但是f2()。然後(...不等待deferred.resolve()並立即在控制檯中拋出「end」,然後執行所有「排隊」的promise。所以我可以做些什麼來等待解析?節點js嵌套Q.all等待解決

+0

用'deferred.resolve();'解決'f2'函數返回的承諾。 –

+0

是的。我需要在解決所有嵌套的promise後解析f2()。 –

+0

您能否提供運行示例並稍微解釋一下您正在嘗試執行的操作? – bitifet

回答

0

正如有人說,(並閱讀幾個後約Q.defer())我看你解決deferred變量多次。

如果我明白你正在嘗試做正確的東西,你應該以後解決(其實「 。關於「)外Q.all()承諾分辨率

//pseudo code 
function f2(){ 
    var deferred = Q.defer(); 
    Q.all(chunked.map(f12)).then(function(results){ 
     // Notice prepended 'return' to not break the chain. 
     return Q.all(results.map(f13)).then(function(){ 
      //f13 returns promise that return value 
      //deferred.resolve(); // Wrong. 
      return f13; 
     }); 
    }).then(function(arr){ 

     deferred.resolve(arr); // <-- This resolves ONCE. 

     // Of course you don't need to return arr if you doesn't 
     // care about it. But I think is always better to do things right. 
     return arr; // Also unnecessary unless you could want to chain 
        // another .then() to the outer promise. 
    }); 
    return deferred.promise; 
} 

f2().then(function(){ 
    console.log("end"); 
}); 

希望它可以幫助(當然,未經測試:它まy包含錯誤,但我認爲它解釋了這個概念)。

編輯:我錯過了說(即使你說你知道這是一個反模式),即,至少在你的例子沒有理由使用Q.defer(),因爲你可以直接返回外Q.all( )承諾......

也許你張貼的內容僅僅是一個簡化版本的更復雜的代碼...

但低於應公開等同行爲,是更簡單:

//pseudo code 
function f2(){ 
    return Q.all(chunked.map(f12)).then(function(results){ 
     // Notice prepended 'return' to not break the chain. 
     return Q.all(results.map(f13)).then(function(){ 
      return f13; 
     }); 
    }) 
} 

f2().then(function(){ 
    console.log("end"); 
}); 
+1

「*至少在你的例子中*」 - 有*總是*當你已經有承諾時沒有理由使用'Q.defer' – Bergi

+0

當然@Bergi !! ...我的意思是在這個簡單的代碼片段中沒有理由「不刪除延遲使用」。更多的coplex代碼可能很難重構(即使我也認爲這樣做會是個好主意)。 – bitifet

+0

是的,這就是我的意思,不管代碼有多複雜,都應該總是重構延遲反模式,而不僅僅是在這個例子中。 – Bergi