我何时应该拒绝承诺?

cdm*_*kay 22 javascript jquery promise jquery-deferred

我正在写一些使用promises的JS代码.例如,我打开一个表单弹出窗口,然后返回一个jQuery Deferred对象.它的工作原理如下:

  • 如果用户在表单上单击"确定"并进行验证,则"延迟"将解析为表示表单数据的对象.

  • 如果用户单击"取消",则"延迟"将解析为空.

我想要决定的是Deferred应该拒绝而不是解决?更一般地说,我想知道何时应该解决类似空对象的问题,何时应该拒绝?

这里有一些代码展示了两个位置:

// Resolve with null.
var promise = form.open()
    .done(function (result) {
        if (result) {
            // Do something with result.
        } else {
            // Log lack of result.
        }
    });

// Reject.
var promise = form.open()
    .done(function (result) {            
        // Do something with result.            
    })
    .fail(function () {
        // Log lack of result.
    });
Run Code Online (Sandbox Code Playgroud)

Fré*_*idi 4

您的两种策略的语义并不完全相同。明确拒绝延期是有意义的。

例如,只要传递给它的延迟对象成功, $.when()就会继续累积结果,但会在第一个失败时退出。

这意味着,如果我们分别重命名您的两个承诺promise1promise2

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});
Run Code Online (Sandbox Code Playgroud)

即使第一个表单被取消,上面的代码也会等到第二个表单关闭,然后再调用传递给 的回调之一then()。调用的回调(成功或失败)仅取决于第二种形式的结果。

但是,如果第二个表单被取消,该代码将不会等待第一个表单关闭后再调用失败回调。