我何时应该拒绝承诺?

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

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

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

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

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

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

这意味着,如果我们分别重命名你的两个promises promise1promise2

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

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

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

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

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

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

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


延迟在这里看起来并不合适。 我只是使用事件。