-->

当我应该拒绝承诺?(When should I reject a promise?)

2019-08-16 22:09发布

我正在写使用承诺一些JS代码。 例如,我打开窗体弹出,我返回一个jQuery的递延对象。 它的工作原理是这样的:

  • 如果用户点击OK的形式,并且它验证,递延解析为对象,表示表单数据。

  • 如果用户点击取消,则递延解析为空。

我试图决定是应该的,而不是递延拒绝,而不是解决? 更一般地,我不知道什么时候我应该下定决心,像一个空的对象,当我应该拒绝?

下面是一些代码演示了两个位置:

// 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.
    });

Answer 1:

你的两个战略的语义是不是真的一样。 明确拒绝延期是有意义的。

例如, $。当()将继续,只要它是通过成功的递延对象累积的结果,但将在其出现故障的第一个摆脱困境。

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

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

上面的代码将等待,直到所述第二形式被关闭时,即使第一形式被取消,调用传递到回调的一个前then() 的调用回调(成功或失败)将只依赖于所述第二形式的结果。

但是,该代码不会等待第一种形式,如果第二种形式是取消调用失败回调之前被关闭。



Answer 2:

因为它是用户控制的,我不会把它当作一个“失败”。 第一种选择似乎更清洁。



Answer 3:

那么,在这两种情况下,你会做不同的事情,所以我会说,往往不是解决这个问题,或者拒绝。 请在解决您的表单提交,并拒绝做任何事。 然后,在一如既往地关闭窗体。

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

如果你不拒绝上的取消,当你曾经拒绝呢? 在这一点上,为什么要用延期对象? 你可以拒绝输入的错误,但你必须产生一个全新的承诺,如果你想,让他们来修复它。


Deferreds真的不看起来正确的事情在这里使用。 我只是使用事件。



文章来源: When should I reject a promise?