Alf*_*ang 5 javascript jquery deferred ecmascript-6 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不是一个函数(…)
如果使用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)
因此,我搜索了延迟的ES6版本:
https://github.com/seangenabe/es6-deferred
但仍然有一个错误:
undefined:1未捕获(承诺)对象{}
实际上,代码只是使用闭包将内部resolve和reject函数保持在外部:
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)
那么,如何才能从我的诺言创建调用中退出resolve和reject行动呢?
对于那些从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)
| 归档时间: |
|
| 查看次数: |
6323 次 |
| 最近记录: |