use*_*108 2 jquery jquery-deferred
我对何时使用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();
};
Run Code Online (Sandbox Code Playgroud)
题
关于何时应该使用deferred.reject()的任何提示或规则?
注意
myVar在某些时候具有动画效果。动画完成后,我要做一些其他事情,然后才解析Deferred对象。
.resolve()并且.reject()是从你的承诺,结果两个不同的可能的分支。
虽然,这实际上取决于程序员如何最佳地使用这两种可能的路径,.resolve(data)通常用于成功的结果,并且可以选择返回具有成功结果的数据,并且.reject(err)通常用于错误条件并返回有关错误的一些信息。
您使用哪个确定.then(f1, f2)为此承诺触发了哪些回调。如果使用.resolve(),则将f1被调用(假定为成功处理程序回调)。如果使用.reject(),则将f2被调用(假设是错误处理程序回调)。
还有一些更高级别的函数可以在promise上运行,例如$.when()(在jQuery世界中)假定.resolve()成功并且.reject()是错误条件。 $.when()当所有的诺言都已解决或任何诺言被拒绝(假定为错误情况)时,将其称为回调。
如果调用代码仅真正在乎操作何时完成(无论操作是否成功完成),那么您就有三个不同的选择,而选择哪个才是您的选择:
1)您可以使用.resolve(),.reject()然后将完成处理程序放入一个函数中,并按如下方式调用它:
doSomething.then(doneHandler, doneHandler);
Run Code Online (Sandbox Code Playgroud)
2)你可以使用.resolve()和.reject()再利用.always()是这样的:
doSomething.always(...);
Run Code Online (Sandbox Code Playgroud)
的缺点.always()是它是jQuery特定的方法,而不是promise标准,因此将来可能会更改。例如,Bluebird和Q Promise库将.finally()这种类型的功能使用。
3)您可以.resolve()同时使用这两个路径,因此无论如何完成/为什么完成,都只有一个完成处理程序。
doSomething.then(fn);
Run Code Online (Sandbox Code Playgroud)
前两个选项的优点是,在将来的某个时候,调用者可以更轻松地实现不同的行为,以成功完成而不是错误完成。
第三种选择的优点是,您可以更轻松地使用此承诺,例如$.when()了解何时完成承诺和其他一些事情。
在查看特定的代码时,应该记住,当您进行异步操作(例如ajax调用)时,promise最好被使用。如果您没有任何异步操作,那么您也可以直接从函数中返回一个值来指示成功或失败,然后让调用代码检查该错误并根据该错误进行分支。使用promise并不像用于同步活动的普通过程代码(例如您问题中的示例代码)那样简单,因此通常没有充分的理由将promise用于纯同步编码。
| 归档时间: |
|
| 查看次数: |
5099 次 |
| 最近记录: |