Ecma 6承诺完成
正如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
尝试'。然后(FN,FN)'。 – 2015-12-21 17:00:43
“*在所有注册的处理程序*之后”是什么意思?你需要做什么? – Bergi
我有2个模块A和B.模块A创建承诺并将其返回给模块B. 在模块A中,在我返回承诺之前,我想附加处理程序,我想始终将其作为最后一个执行,因为我期望在模块B获得Promise实例时在模块B中附加的其中一个处理程序中发生某些事情。 无论您在模块B中附加了多少个处理程序,我都需要在模块A中附加此处理程序,最后才能执行Promise。 – stefo0O0o