【问题标题】:JavaScript native Promise() without callback没有回调的 JavaScript 原生 Promise()
【发布时间】:2014-06-28 11:32:55
【问题描述】:

看看这个 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 原生承诺,将其作为参数传递给函数和解析?

【问题讨论】:

  • @user2864740 我知道这是一条老评论,但这是个玩笑吗?
  • @Mathletics 一点也不。这是一个严肃的评论,说明了一个无效的(最近修复的)拼写,目的是让原作者更正。
  • @Mathletics 谢谢)

标签: javascript jquery design-patterns promise ecmascript-harmony


【解决方案1】:

执行流程会有些不同,但基本上是一样的:

function some(resolve, reject) {
    resolve();
}

var promise = new Promise(some);

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

some 不是通过 Promise 本身,而是通过 resolvereject 函数。因此,依赖关系正好相反。

【讨论】:

    【解决方案2】:

    这是一个基本实现,可以按原样保留您的应用程序流程。

    不要在现实生活中使用它——你会错过投掷安全(感谢@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 的回答对我来说更容易接受,但无论如何谢谢你的认识
    • 请不要真的这样做。 Deferred 对象不好而 Promise 构造函数更好(抛出安全)是有原因的。
    猜你喜欢
    • 2014-12-24
    • 2015-05-15
    • 2015-10-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-19
    • 1970-01-01
    • 2021-01-11
    • 1970-01-01
    相关资源
    最近更新 更多