2

如果.when相当于 JQuery Promises 的“and”运算符,那么“Or”运算符的等价物是什么?

如果我有两个 Promise,并且我想在两者都解决后做某事,那么我应该使用“when”方法。但是我有一个场景,当一个承诺或另一个承诺已经解决时,我想做一些事情。

场景是数据库初始化。第一个承诺与检查数据库是否已经存在有关。如果第一个承诺被拒绝,第二个承诺来自创建数据库。然后我想运行一些以第一个承诺或第二个承诺为条件的代码。

目前我的代码看起来有点像这样:

function initialiseDB() {
    var deferred = jQuery.Deferred();

    // Check to see if the database exists already
    var existencePromise = checkExistenceOfDatabase();

    existencePromise.done(function() {
        // The database exists; no need to pull a copy
        deferred.resolve(); 
    });
    existencePromise.fail( function(error) {
        // Failed to confirm existence of database; pull a copy
        var pullPromise = pullDatabase();

        pullPromise.fail( function(error) {
            // Failed to pull database
            deferred.reject();
        });
        pullPromise.done( function() {
            // A copy of the database has been pulled
            deferred.resolve();
        });
    });

    return deferred.promise();
}

这实际上是一个自定义的“惰性或”运算符。

我是 JQuery 的 Promises 的新手,我花了很长时间寻找一个通用的“或”方法。上面的代码是应该如何完成的,还是我错过了一个通用形式?

4

2 回答 2

1

这是您可以尝试的功能 - 我们称之为whenAny

var whenAny = function() {
  var finish = $.Deferred();
  $.each(arguments, function(index, def){
    def.done(finish.resolve);
  });
  return finish.promise();
}

用法:whenAny(def1, def2, def3)

您可能需要在这里和那里进行一些调整,也许是关于参数传递,找出实际解决的问题等等,但您明白了。

感谢您提出这个用例......我想我实际上可能会将它添加到simple-deferred中。看起来还蛮有用的。

于 2013-04-15T04:09:00.433 回答
1

马修,您的代码将简化为:

function initialiseDB() {
    var deferred = jQuery.Deferred();
    checkExistenceOfDatabase().done(deferred.resolve).fail(function(error) {
        pullDatabase().fail(deferred.reject).done(deferred.resolve);
    });
    return deferred.promise();
}

我很确定它将进一步简化为:

function initialiseDB() {
    return checkExistenceOfDatabase().then(null, function(error) {
        return pullDatabase();
    });
}

或者非常简洁:

function initialiseDB() {
    return checkExistenceOfDatabase().then(null, pullDatabase);
}

尽管 nett 效应类似于 or,但它确实是顺序逻辑……这正是您想要的;ie只有在失败pullDatabase时才应该调用。checkExistenceOfDatabase()

于 2013-04-15T04:01:29.887 回答