javascript Promise.defer() 浏览器支持

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27889687/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 08:08:00  来源:igfitidea点击:

Promise.defer() browser support

javascriptcross-browserpromisees6-promise

提问by just-boris

I am looking for a way to create deferred object which will be resolved outside the current scope. I like deferred objects and as I see Promise.defer()in Chrome 38 returns the deferred object.

我正在寻找一种创建延迟对象的方法,该对象将在当前范围之外解析。我喜欢延迟对象,正如我Promise.defer()在 Chrome 38 中看到的那样返回延迟对象。

But in latest Firefox 34 Promise.deferis undefined as well in Safari 8.0.

但是在最新的 Firefox 34Promise.defer中,Safari 8.0 中也未定义。

So I can't use Promise.defereverywhere now. What about future status? Will it be implemented in other browsers or will be removed as deprecated?

所以我Promise.defer现在不能到处使用。未来地位如何?它会在其他浏览器中实现还是会因弃用而被删除?

回答by Alexander O'Mara

According to the MDN article on Deferred, the .defermethod is obsolete. If you look at this bug issue, it says that Promise.deferis non-standard, so it's not likely to return.

根据关于 Deferred 的 MDN 文章,该.defer方法已过时。如果你查看这个 bug issue,它说这Promise.defer是非标准的,所以它不太可能返回。

Starting from Gecko 30, this object is obsolete and should not be used anymore. Use the new Promise()constructor instead.

从 Gecko 30 开始,此对象已过时,不应再使用。改用new Promise()构造函数。

They offer an example of how to rewrite Promise.defercode, to instead use new Promise.

他们提供了一个如何重写Promise.defer代码的示例,而是使用new Promise.

Promise.defer

Promise.defer

var deferred = Promise.defer();
doSomething(function cb(good) {
    if (good)
        deferred.resolve();
    else
        deferred.reject();
});
return deferred.promise;

new Promise

新承诺

return new Promise(function(resolve, reject) {
    doSomething(function cb(good) {
        if (good)
            resolve();
        else
            reject();
    });
});

There are several advantages to the new format, including cleaner code, and improved throw safety (if the code in the promise init function throws synchronously the promise will reject).

新格式有几个优点,包括更干净的代码和改进的 throw 安全性(如果 promise init 函数中的代码同步抛出,promise 将拒绝)。

回答by dfsq

Although I doubt this is a good idea, but technically you can implement custom deferred object based on Promises. For example:

虽然我怀疑这是一个好主意,但从技术上讲,您可以基于 Promise 实现自定义延迟对象。例如:

function defer() {
    var deferred = {};
    var promise = new Promise(function(resolve, reject) {
        deferred.resolve = resolve;
        deferred.reject  = reject;
    });
    deferred.promise = promise;
    return deferred;
}

var deferred = defer();

deferred.promise.then(function(data) {
    document.body.innerHTML += '<p>Resolved: ' + data + '</p>';
});

document.body.innerHTML = '<p>Deferred created.</p>';

setTimeout(function() {
    deferred.resolve(123);
}, 2000);