我何时应该拒绝承诺?

时间:2013-02-12 20:54:11

标签: javascript jquery jquery-deferred promise

我正在编写一些使用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.
    });

3 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

答案 1 :(得分:2)

由于它是用户控制的,我不会将其视为“失败”。第一种选择似乎更清晰。

答案 2 :(得分:0)

嗯,在这两种情况下你会做一些不同的事情,所以我会说要么总是解决它,要么拒绝它。你的表格发布决定,拒绝什么都不做。然后,一直关闭表格。

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

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


Deferreds在这里看起来并不合适。我只是使用活动。