回答
正如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.
});
}
是的,看起來完全像處理器模式:-) – Bergi
是的,不知道名稱它! – loganfsmyth
謝謝你們的答案。我現在看到了,但是一直在思考,如果ES6原生這是可能的。重組似乎很好,但我的想法是,這個承諾的用戶不知道我在那些附屬處理程序之前/之後注入的內容。 問題已解決! – stefo0O0o
- 1. 我的ECMA 6承諾不同步解決
- 2. NodeJS承諾等待完成
- 3. Node.js:forEach在承諾履行前完成承諾
- 4. 在承諾與Mocha,Chai和Sinon完成後測試不承諾
- 5. Deftjs承諾完成()不起作用
- 6. 完成承諾沒有拒絕/解決?
- 7. 等待承諾完成服務
- 8. 的Javascript模式完成承諾
- 9. 等待嵌套承諾完成
- 10. 有條件地完成承諾鏈
- 11. 使用承諾等待函數完成
- 12. Angularfire2承諾完成不調用函數
- 13. Promise Js:等待承諾完成
- 14. Angularjs:$ Q承諾之前調用完成
- 15. 等待每個承諾內完成
- 16. 完成node.js內部的循環承諾
- 17. q承諾在完成之前解決?
- 18. 等到承諾和嵌套thens完成
- 19. Perl 6可以承諾多少個承諾?
- 20. 斯諾拉承諾多次完成時忽略異常
- 21. 當任何承諾完成時,是否有可能履行承諾?
- 22. 摩卡 - 測試承諾,`完成`永遠不會被調用在承諾
- 23. 代碼的承諾。於是承諾之前發射的方式完成
- 24. Promise()的ECMA 6語法
- 25. 承諾內承諾
- 26. 承諾拒絕失敗,承諾承諾
- 27. 承諾中的承諾承諾
- 28. 微風經理回覆承諾成功之前回電完成
- 29. Bluebird Promise.all - 多個承諾完成彙總成功和拒絕
- 30. 在角度承諾中使用'完成'而不是'成功'
嘗試'。然後(FN,FN)'。 – 2015-12-21 17:00:43
「*在所有註冊的處理程序*之後」是什麼意思?你需要做什麼? – Bergi
我有2個模塊A和B.模塊A創建承諾並將其返回給模塊B. 在模塊A中,在我返回承諾之前,我想附加處理程序,我想始終將其作爲最後一個執行,因爲我期望在模塊B獲得Promise實例時在模塊B中附加的其中一個處理程序中發生某些事情。 無論您在模塊B中附加了多少個處理程序,我都需要在模塊A中附加此處理程序,最後才能執行Promise。 – stefo0O0o