【发布时间】:2016-11-19 23:18:33
【问题描述】:
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(); })
当我点击按钮时,它失败了,因为promise没有reject和resolve方法。
未捕获的类型错误: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(); })
3。尝试为 es6 找到一个延迟接口。
于是我搜索了一个ES6 EDITION的deferred:
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(); })
那么,如何从我的 Promise 创建调用中提取 resolve 和 reject 操作?
【问题讨论】:
-
使用
Promise的目的是什么?.then()没有出现在问题中? -
这个问题已经被问过很多次了。延迟对象没有内置到 ES6 Promise 中,因为正如 here 所解释的那样,它根本不需要。而且,如果你想制造一个,只需要几行 ES6 代码就可以做到。
-
其实我用的是vuex,我在vuex的actions中创建promise弹出对话框,但是需要在组件中resolve或者reject这个promise。
-
Promise在问题的javascript处被解决或拒绝,尽管没有值或原因作为参数传递? -
如何在几行 ES6 承诺代码中创建延迟:stackoverflow.com/questions/37651780/…(尽管您永远不需要这样做)。
标签: javascript jquery ecmascript-6 deferred es6-promise