2015-12-21 59 views
0

我正在試驗來自ES6的Promise,但是我找不到任何替代方法來完成jQuery ajax。我需要在所有註冊的處理程序之後用「then」執行函數。Ecma 6承諾完成

謝謝!

+0

嘗試'。然後(FN,FN)'。 – 2015-12-21 17:00:43

+1

「*在所有註冊的處理程序*之後」是什麼意思?你需要做什麼? – Bergi

+0

我有2個模塊A和B.模塊A創建承諾並將其返回給模塊B. 在模塊A中,在我返回承諾之前,我想附加處理程序,我想始終將其作爲最後一個執行,因爲我期望在模塊B獲得Promise實例時在模塊B中附加的其中一個處理程序中發生某些事情。 無論您在模塊B中附加了多少個處理程序,我都需要在模塊A中附加此處理程序,最後才能執行Promise。 – stefo0O0o

回答

2

正如Bergi所提到的,您要的是disposer pattern。你的承諾的中心概念似乎有點偏離,我認爲這讓你更難以推斷。當你打電話給.then時,你並沒有在概念上「附加一個處理程序」,你正在創建一個新的承諾,在處理程序的所有.then處理程序已經運行之後,根據定義將解析

鑑於你的核心問題基於這樣的代碼:

// a.js 
module.exports = function(){ 
    // Where 'Promise.resolve()' is a stand in for your ajax. 
    return Promise.resolve() 
     .then(function(){ 
      // Want this to run after 'B'. 
     }); 
} 

// b.js 
var makePromise = require('./a'); 
module.exports = function specialMakePromise(){ 
    return makePromise().then(function(){ 
     // Should run first. 
    }); 
} 

他們總是在錯誤的順序運行,因爲根據定義,從a.js.then處理程序必須.then處理程序之前從b.js運行並完成。要解決這個問題,而不是將構建這樣的代碼

方式一:

// a.js 
module.exports = function(callback){ 
    return Promise.resolve() 
     .then(callback) 
     .then(function(){ 
      // Want this to run after 'B'. 
     }); 
} 

// b.js 
var makePromise = require('./a'); 
module.exports = function specialMakePromise(){ 
    return makePromise(function(){ 
     // Should run first. 
    }); 
} 
+0

是的,看起來完全像處理器模式:-) – Bergi

+1

是的,不知道名稱它! – loganfsmyth

+0

謝謝你們的答案。我現在看到了,但是一直在思考,如果ES6原生這是可能的。重組似乎很好,但我的想法是,這個承諾的用戶不知道我在那些附屬處理程序之前/之後注入的內容。 問題已解決! – stefo0O0o