推迟与承诺

fle*_*sod 74 jquery promise jquery-deferred

除了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.???
});
Run Code Online (Sandbox Code Playgroud)

Fel*_*ing 123

第一:你不能使用,$.Promise();因为它不存在.

一个延迟的对象是一个对象,可以创建一个承诺,并改变其状态resolvedrejected.如果您编写自己的函数并希望为调用代码提供承诺,则通常会使用延迟.你是价值的生产者.

一个承诺,正如它的名字说,一个关于未来价值的承诺.您可以将回调附加到它以获取该值.承诺是"给予"给你的,你是未来价值的接受者.
您无法修改承诺的状态.只有创建 promise 的代码才能更改其状态.

例子:

1.(产品)当您想为自己的功能提供承诺支持时,可以使用延迟对象.您计算一个值并希望控制何时解析承诺.

function callMe() {
    var d = new $.Deferred();
    setTimeout(function() {
        d.resolve('some_value_compute_asynchronously');
    }, 1000);
    return d.promise();
}

callMe().done(function(value) {
    alert(value);
});
Run Code Online (Sandbox Code Playgroud)

2.(转发)如果您正在调用一个本身返回一个promise的函数,那么您不必创建自己的延迟对象.你可以回报这个承诺.在这种情况下,函数不会创建值,而是转发它(种类):

function fetchData() {
    // do some configuration here and pass to `$.ajax`
    return $.ajax({...});
}

fetchData().done(function(response) {
    // ...
});
Run Code Online (Sandbox Code Playgroud)

3.(接收)有时你不想创建或传递promises/values,你想直接使用它们,即你是某些信息的接收者:

$('#my_element').fadeOut().promise().done(function() {
    // called when animation is finished
});
Run Code Online (Sandbox Code Playgroud)

当然,所有这些用例也可以混合使用.您的函数可以是值的接收者(例如,来自Ajax调用),并基于此计算(生成)不同的值.


相关问题: