我如何推迟像jerr Deferred这样的ES6承诺?

Alf*_*ang 5 javascript jquery deferred ecmascript-6 es6-promise

1.使用es6 promise,但是语法不正确。

我正在使用es6,并希望创建一个延迟确认对话框:

// First, create an empty promise:
let promise = new Promise((resolve, reject) => {})

// Then, show the dialog:
let $dialog = $('#dialog-confirm').show();

// FAIL: I want to trigger the promise resolver, but failed.
$dialog.find('.btn-yes').click(() => { promise.resolve(); })
$dialog.find('.btn-no').click(() => { promise.reject(); })
Run Code Online (Sandbox Code Playgroud)

当我单击按钮时,它失败了,因为Promise没有rejectand resolve方法。

未被捕获的TypeError:promise.resolve不是一个函数(…)

2. jQuery的工作代码:

如果使用jQuery,我们可以执行以下操作:

// First, create an empty promise:
var dfd = $.Deferred();
var promise = dfd.promise();

// Then, show the dialog:
var $dialog = $('#dialog-confirm').show();

// SUCCESS: jQuery deferred works
$dialog.find('.btn-yes').click(() => { dfd.resolve(); })
$dialog.find('.btn-no').click(() => { dfd.reject(); })
Run Code Online (Sandbox Code Playgroud)

3.尝试查找es6的延迟接口。

因此,我搜索了延迟的ES6版本

https://github.com/seangenabe/es6-deferred

但仍然有一个错误:

undefined:1未捕获(承诺)对象{}

实际上,代码只是使用闭包将内部resolvereject函数保持在外部:

https://github.com/seangenabe/es6-deferred/blob/master/deferred.js

如果执行相同的策略:

let dfd = {};

let $dialog = $('#dialog-confirm').show();

let promise = (function() {
    return dfd.promise = new Promise(function(resolve, reject) {
        dfd.resolve = resolve;
        dfd.reject = reject;
    });
})();

// FAIL: still not working.
$dialog.find('.btn-yes').click(() => { dfd.resolve(); })
$dialog.find('.btn-no').click(() => { dfd.reject(); })
Run Code Online (Sandbox Code Playgroud)

那么,如何才能从我的诺言创建调用中退出resolvereject行动呢?

aas*_*onk 6

对于那些从Google来到这里的人来说,值得一提的是ES6的承诺很好,我经常使用它们。但是,在某些情况下,延迟的模式会导致代码明显减少。在大多数情况下,您可能应该只使用ES6 Promise,但是在那些特殊的情况下,延迟模式才有意义,那么它就很容易包装ES6 Promise。在我看来,包括一个节点模块似乎太过致命了。

function generateDeferredPromise() {
  return (() => {
    let resolve;
    let reject;

    let p = new Promise((res, rej) => {
      resolve = res;
      reject = rej;
    });

    return {
      promise: p,
      reject,
      resolve
    };
  })();
}
Run Code Online (Sandbox Code Playgroud)