2015-01-17 4 views
0

Я взял следующий код из docs:Изменение отложенного при его возврате?

function asyncEvent() { 
    var dfd = new jQuery.Deferred(); 

    // Resolve after a random interval 
    setTimeout(function() { 
    dfd.resolve("hurray"); 
    }, Math.floor(400 + Math.random() * 2000)); 

    // Reject after a random interval 
    setTimeout(function() { 
    dfd.reject("sorry"); 
    }, Math.floor(400 + Math.random() * 2000)); 

    // Show a "working..." message every half-second 
    setTimeout(function working() { 
    if (dfd.state() === "pending") { 
     dfd.notify("working... "); 
     setTimeout(working, 500); 
    } 
    }, 1); 

    // Return the Promise so caller can't change the Deferred 
    return dfd.promise(); 
} 

// Attach a done, fail, and progress handler for the asyncEvent 
$.when(asyncEvent()).then(
    function(status) { 
    alert(status + ", things are going well"); 
    }, 
    function(status) { 
    alert(status + ", you fail this time"); 
    }, 
    function(status) { 
    $("body").append(status); 
    } 
); 

Я очень нуб в понимании отложенное обещают с линией:

// Return the Promise so caller can't change the Deferred 
return dfd.promise(); 

Ладно, я понял, что мы не можем изменить разрешение или отклонение свойства объекта Отсрочка.

Но с использованием return dfd, чем return dfd.promise(), вызывающий может изменить отложенный объект. Я не мог найти в дикой природе. Можете ли вы привести пример (ясное понятие), если я вернусь вместо отложенного (просто чтобы узнать об этом правильно)?

ответ

1

Объяснение

Если вы используете return dfd вместо return dfd.promise(), вызывающий абонент может реально изменить состояние обещание.

Означает вызывающий абонент может позвонить resolve, reject, notify, resolveWith, rejectWith и notifyWith на возвращаемом dfd объекта, чтобы изменить состояние Deffered объекта.

Выполняя return dfd.promise(), вы избегаете вызова из этого. Это подходит для сценария, для которого вы не хотите изменять состояние Deferred object функцией вызывающего абонента.


Пример

function asyncEvent() { 
    var dfd = new jQuery.Deferred(); 

    // Resolve after a random interval 
    setTimeout(function() { 
     dfd.resolve("hurray"); 
    }, Math.floor(400 + Math.random() * 2000)); 

    // Reject after a random interval 
    setTimeout(function() { 
     dfd.reject("sorry"); 
    }, Math.floor(400 + Math.random() * 2000)); 

    // Show a "working..." message every half-second 
    setTimeout(function working() { 
     if (dfd.state() === "pending") { 
      dfd.notify("working... "); 
      setTimeout(working, 500); 
     } 
    }, 1); 

    // Return the Promise so caller can't change the Deferred 
    return dfd; 
} 


// Attach a done, fail, and progress handler for the asyncEvent 
$.when(asyncEvent().reject("sorry")).then(

function (status) { 
    alert(status + ", things are going well"); 
}, 

function (status) { 
    alert(status + ", you fail this time"); 
}, 

function (status) { 
    $("body").append(status); 
}); 

В этом примере вместо возврата dfd.promise() я возвращаюсь dfd объект. И тогда я отвергая его непосредственно, когда она вызывается под $.when


JS Fiddle

http://jsfiddle.net/8mbgzrkn/1/


Если изменить функцию asyncEvent() вернуть return dfd.promise(); и выполнить тот же самый код снова, вам обязательно получит ошибку, так как неопределенная не является функцией на этой линии

promise error

+0

Измененный ответ соответственно. – Kelsadita

+0

Проверьте эту ссылку: http://www.mattgreer.org/articles/promises-in-wicked-detail/ – Kelsadita

+0

Но, кажется, я читал этот блог раньше ... –

1

Редактировать, Обновлено

Jquery по всей видимости, удаляются с обнажением resolve, reject, notify, resolveWith, rejectWith и notifyWith методы в рамках .then на самой последней версии; хотя по-прежнему подвергается в 1.7.2http://jsfiddle.net/8mbgzrkn, http://jsfiddle.net/8mbgzrkn/1

var fn = function() { 
    var dfd = new $.Deferred(); 
    dfd.resolve(1); 
    return dfd 
}; 

var res = fn().then(function(data) { 
    console.log(data, this); 
    //this.resolve(2); 
    return this 
}); 

res.then(function(deferred) { 
    console.log(deferred) 
}); 
Смежные вопросы