除了jQuery版本之外,Deferred和Promise之间有什么区别?
我应该为我的需要使用什么?我只想调用fooExecute()。我只需要fooStart()和fooEnd()来切换html div状态为例。
//I'm using jQuery v2.0.0 function fooStart() { /* Start Notification */ } function fooEnd() { /* End Notification */ } function fooExecute() { /* Execute the scripts */ } $('#button1').on('click',function() { var deferred1 = $.Deferred(); var promise1 = $.Promise(); deferred1.??? promise1.??? });
解决方法
首先:你不能使用$ .Promise();因为它不存在。
延迟对象是一个可以创建promise并将其状态更改为已解决或已拒绝的对象。如果您编写自己的函数并希望对调用代码提供一个promise,则通常使用延迟。你是价值的生产者。
正如名字所说,承诺是对未来价值的承诺。你可以附加回调来获取该值。承诺是“给予”你,你是未来价值的接受者。
您不能修改promise的状态。只有创建promise的代码可以改变它的状态。
例子:
1.(产生)当您想为自己的函数提供promise支持时,使用延迟对象。您计算一个值,并希望控制何时解决promise。
function callMe() { var d = new $.Deferred(); setTimeout(function() { d.resolve('some_value_compute_asynchronously'); },1000); return d.promise(); } callMe().done(function(value) { alert(value); });
2.(forward)如果你调用一个函数本身返回一个promise,那么你不必创建自己的延迟对象。你可以返回那个承诺。在这种情况下,函数注意创建一个值,但转发它(种类):
function fetchData() { // do some configuration here and pass to `$.ajax` return $.ajax({...}); } fetchData().done(function(response) { // ... });
3.(接收)有时你不想创建或传递promises /值,你想直接使用它们,即你是一些信息的接收者:
$('#my_element').fadeOut().promise().done(function() { // called when animation is finished });
当然所有这些用例也可以混合使用。您的函数可以是值的接收者(例如从Ajax调用),并基于此计算(产生)不同的值。
相关问题:
> What are the differences between Deferred,Promise and Future in Javascript?
> What’s the difference between a Deferred object and its own promise object?