何时使用deferred.reject()?

我很困惑何时使用deferred.resolve()deferred.reject()

快速示例

 var doSomething = function() { var deferred = $.Deferred(); if ( typeof myVar === "object" ) { // Do something with myVar - Start. deferred.resolve(); // Do something with myVar - End. } else { // myVar isn't an object, but the function has finished executing // and that's what I want to know. // With reject() I'll be forced to use always() instead of done() // because there'll be also a fail() method available if myVar // is not an object. deferred.reject(); } return deferred.promise(); }; 

关于何时应该使用deferred.reject()的任何提示或规则?

注意

myVar在某些时候是动画的。 动画完成后,我会做一些其他的事情,然后才解决Deferred对象。

.resolve().reject()是您承诺的两种不同可能的结果分支。

虽然,程序员如何最好地使用这两种可能的路径, .resolve(data)通常用于成功的结果,并且可选地以成功的结果返回数据,而.reject(err)通常用于错误条件。并返回有关错误的一些信息。

您使用哪个确定为此承诺触发了哪些回调.then(f1, f2) 。 如果使用.resolve() ,则调用f1 (假设为成功处理程序回调)。 如果使用.reject() ,则调用f2 (假定为error handling程序回调)。


还有一些更高级别的函数在promises上运行,例如$.when() (在jQuery世界中),假设.resolve()是成功的,而.reject()是一个错误条件。 $.when()在所有promise已解决或任何promise被拒绝时(假定为错误条件)调用它的回调。


如果调用代码仅在操作完成时真正关心(无论是否成功完成),那么您有三个不同的选项,您可以选择哪个选项:

1)你可以使用.resolve().reject()然后将你的完成处理程序放在一个函数中并像这样调用它:

 doSomething.then(doneHandler, doneHandler); 

2)你可以使用.resolve().reject() ,然后像这样使用.always()

 doSomething.always(...); 

.always()一个缺点是它是一个特定于jQuery的方法,而不是一个promise标准,所以它可能在将来发生变化。 例如,Bluebird和Q promise库使用.finally()来表示此类function。

3)您可以对两个路径使用.resolve() ,这样您只有一个完成处理程序,无论它是如何/为什么完成的。

 doSomething.then(fn); 

前两个选项的优点是,在将来的某个时间,调用者可以更容易地实现不同的行为,以便成功完成与错误完成。

第三个选项的优点是你可以更容易地使用$.when()类的东西来知道什么时候它和其他一些东西都完成了。


在查看特定代码时,您应该记住,当您进行异步操作(例如ajax调用)时,最好使用promise。 如果您没有任何异步操作,那么您也可以直接从函数中返回一个值来指示成功或失败,并让调用代码检查该错误并根据该分支进行分支。 使用promises并不像同步活动的简单过程代码那样简单(例如你问题中的示例代码),因此通常没有充分的理由使用promises进行纯同步编码。