Ecma 6承诺完成

问题描述:

我正在试验来自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

正如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