【问题标题】:Ecma 6 Promise completeEcma 6 承诺完成
【发布时间】:2016-03-27 19:49:42
【问题描述】:

我正在尝试使用 ES6 的 Promise,但我找不到任何替代方法来完成 jQuery ajax。我需要在所有使用“then”注册的处理程序之后执行函数。

谢谢!

【问题讨论】:

  • 试试.then(fn, fn)。
  • “在所有注册的处理程序之后”到底是什么意思?你需要这个做什么?
  • 我有 2 个模块 A 和 B。模块 A 创建 Promise 并将其返回给模块 B。在模块 A 中,在返回 Promise 之前,我想附加我希望始终执行的处理程序最后一个,因为我希望当模块 B 获得 Promise 实例时,模块 B 中附加的一个处理程序中会发生一些事情。无论您在模块 B 中附加了多少处理程序,我都需要在返回 Promise 之前将这个处理程序附加到模块 A 中以最后执行。
  • @stefo0O0o:这对于一个简单的承诺是不可能的。对于这样的事情,你应该使用promise disposer pattern

标签: ajax promise ecmascript-6


【解决方案1】:

正如 Bergi 所说,您想要的是disposer pattern。你对承诺的核心概念似乎有点偏离,我认为这让你更难推理。当您调用 .then 时,您在概念上并不是在“附加处理程序”,而是在创建一个新的 Promise,根据定义在它的所有 .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 处理程序必须在来自b.js 的.then 处理程序之前运行和完成。

解决这个问题的一种方法是像这样构造你的代码:

// 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.
    });
}

【讨论】:

  • 是的,看起来和处理器模式一模一样 :-)
  • 是的,不知道它的名字!
  • 感谢大家的回答。我现在看到了,但在想这是否可以使用 ES6 原生。重组似乎很好,但我的想法是这个承诺的用户不知道我在附加的处理程序之前/之后注入了什么。问题已解决!
猜你喜欢
  • 1970-01-01
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-16
  • 2018-07-21
相关资源
最近更新 更多