没有回调函数的JavaScript原生Promise()

5

看看这段 jQuery 代码:

var promise = new Deferred(),
    some;

some = function(promise) {
    // do cool things

    promise.resolve();
};

promise.then(/*  callback cool things   */);

// init everything
some(promise);

我不确定这种方法的架构正确性,但我长期以来一直在使用它,这对我很方便。

在原生JavaScript中,我无法使用这种方法。构造函数new Promise()需要一个回调参数,因此我无法将Promise实例作为参数传递。

所以我的问题是:如何预定义JavaScript本机promise,将其作为参数传递给函数并解决它?


@user2864740 我知道这是一个旧评论,但那是个笑话吗? - Evan Davis
@Mathletics 完全不是。这是一个严肃的评论,旨在说明一个无效(最近已修复)的拼写错误,并旨在促使原作者进行更正。 - user2864740
@Mathletics 谢谢) - Boris Zagoruiko
2个回答

2
执行流程会有一些不同,但基本上工作方式相同:
function some(resolve, reject) {
    resolve();
}

var promise = new Promise(some);

promise.then(/*  callback cool things   */);

与其将承诺本身传递给some,它将传递resolvereject函数。因此,依赖关系是相反的。


0
这是一个基本实现,可以保持您的应用程序流程不变。
请勿在现实生活中使用此功能 - 这将导致您失去抛出异常的安全性(感谢@BenjaminGruenbaum的提示)。
var MyDeferred = function() {
    var _resolve,
        _reject,
        capturedPromise = new Promise(function(resolve, reject){
            _resolve = resolve;
            _reject  = reject;
        });

    return {
        'resolve' : _resolve,
        'reject'  : _reject,
        'then'    : function() { capturedPromise.then.apply(capturedPromise, arguments); },
        'catch'   : function() { capturedPromise.catch.apply(capturedPromise, arguments); }
    }
};

@Felix的答案对我来说更可接受,但无论如何感谢你的意识。 - Boris Zagoruiko
请不要这样做。延迟对象不好的原因是 Promise 构造函数更好(抛出安全异常)。 - Benjamin Gruenbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接