何时使用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进行纯同步编码。