jquery - 如何在 JQuery 中 "or"两个 Promise

标签 jquery promise

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

如果我有两个 Promise,并且我想在两个 Promise 都解决后做某事,那么我应该使用“when”方法。然而,我有一个场景,当一个 promise 或另一个 promise 得到解决时,我想做一些事情。

该场景是数据库初始化。第一个 promise 与检查数据库是否已存在有关。如果第一个 promise 被拒绝,第二个 promise 来自创建数据库。然后,我想运行一些代码,这些代码的条件是第一个 promise 已得到解决或第二个 promise 已得到解决。

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

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 很陌生,我花了相当长的时间寻找通用的“Or”方法。上面的代码是应该如何完成的,还是有我错过的通用形式?

最佳答案

Matthew,你的代码将简化为:

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的,但它实际上是顺序逻辑......这正是您想要的;即仅当 checkExistenceOfDatabase() 失败时才应调用 pullDatabase

关于jquery - 如何在 JQuery 中 "or"两个 Promise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16007168/

相关文章:

javascript - 使用 promises/defer 异步迭代一组文件

javascript - 如何通过 Promise 包装 useQuery hook

php - jquery onclick 中的 ajax post

node.js - Knex.js - Node 进程永远不会退出,如何优雅地关闭它 - 但只有当所有查询都得到解决时?

jQuery 在应用类之前计算高度

javascript - bootstrap datepicker 设置日期格式 dd/mm/yyyy

javascript - React Native 中的 Promise

node.js - 防止 "Unhandled promise rejection"错误

jquery - 选择不是当前元素/JQuery 父级的先前标题

javascript - 重置输入文件时删除事件处理程序