Javascript 我什么时候应该拒绝承诺?

Javascript 我什么时候应该拒绝承诺?,javascript,jquery,jquery-deferred,promise,Javascript,Jquery,Jquery Deferred,Promise,我正在编写一些使用承诺的JS代码。例如,我打开一个窗体弹出窗口并返回一个对象。它的工作原理如下: 如果用户在表单上单击OK并进行验证,则延迟解析为表示表单数据的对象 如果用户单击“取消”,则延迟解析为null 我试图决定的是,推迟的人是否应该拒绝,而不是下定决心?更一般地说,我想知道什么时候应该解析为空对象,什么时候应该拒绝 下面是一些代码,演示了这两个位置: // Resolve with null. var promise = form.open() .done(function

我正在编写一些使用承诺的JS代码。例如,我打开一个窗体弹出窗口并返回一个对象。它的工作原理如下:

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

  • 如果用户单击“取消”,则延迟解析为null

我试图决定的是,推迟的人是否应该拒绝,而不是下定决心?更一般地说,我想知道什么时候应该解析为空对象,什么时候应该拒绝

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

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

因为它是用户控制的,所以我不会把它视为“失败”。第一个选项看起来更干净。

好吧,在这两种情况下,你会做一些不同的事情,所以我会说,要么解决它,要么拒绝它。在“解决”和“拒绝”上发布您的表单。然后,启用“始终”,关闭窗体

var promise = form.open()
.done(function (result) {            
    // Do something with result.            
})
.fail(function () {
    // Log lack of result.
})
.always(function() {
    // close the form.
})
如果你没有拒绝取消,你什么时候会拒绝呢?那么,为什么要使用延迟对象呢?您可以拒绝输入错误,但如果您想允许他们修复它,您必须生成一个全新的承诺



在这里,延期似乎不是正确的做法。我只使用事件。

两种策略的语义实际上并不相同。明确拒绝延期付款是有意义的

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

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

$.when(promise1, promise2).then(function() {
    // Success...
}, function() {
    // Failure...
});
上面的代码在调用传递给
then()
的其中一个回调之前,将等待第二个表单关闭,即使第一个表单被取消。调用的回调(成功或失败)将仅取决于第二种形式的结果


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

似乎是一个完全有效的设计决策。我不认为一个方法比另一个好,但我通常会将
失败
与出错联系起来,例如异常而不是选择的值,即未能履行承诺,而不是用某个值来完成承诺。@ExplosionPills是的,这就是我试图处理的问题。所以我应该把拒绝承诺视为与例外一样严重吗?@cdmckay Well。。这其实没有什么必要,但至少jQuery对ajax延迟对象似乎就是这么做的。使用承诺是否总是需要拒绝案例?我想不需要,这取决于具体情况。如果是单个异步操作,承诺总是比事件好。你可以在承诺上使用组合符,而这在事件中是做不到的。