24

我正在编写一些使用承诺的 JS 代码。例如,我打开一个表单弹出窗口并返回一个jQuery Deferred对象。它是这样工作的:

  • 如果用户在表单上单击“确定”并进行验证,则 Deferred 将解析为表示表单数据的对象。

  • 如果用户单击 Cancel,则 Deferred 解析为 null。

我想要决定的是 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.
    });
4

3 回答 3

4

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

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

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

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});

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

但是,如果取消第二个表单,则该代码不会在调用失败回调之前等待第一个表单关闭。

于 2013-02-12T21:03:25.517 回答
2

由于它是用户控制的,我不会将其视为“失败”。第一个选项似乎更干净。

于 2013-02-12T20:57:29.620 回答
0

好吧,在这两种情况下你都会做一些不同的事情,所以我会说总是要么解决它,要么拒绝它。在解决时发布您的表单,在拒绝时什么也不做。然后,始终关闭表单。

var promise = form.open()
.done(function (result) {            
    // Do something with result.            
})
.fail(function () {
    // Log lack of result.
})
.always(function() {
    // close the form.
})

如果您在取消时没有拒绝,那么您什么时候拒绝过?那时,为什么要使用延迟对象?你可以拒绝输入错误,但如果你想让他们修复它,你必须生成一个全新的承诺。


延期似乎并不适合在这里使用。我只是使用事件。

于 2013-02-12T20:57:49.253 回答