jQuery 1.5引入了新的Deferred对象以及附带的方法 .when
, .Deferred
和 ._Deferred
。
如果你之前没有使用过 .Deferred
,我已经为它的源码添加了注释。
这些新方法的可能用法是什么?我们该如何将它们应用到模式中呢?
我已经阅读了API和源代码,所以我知道它们是干什么的。我的问题是:我们如何在日常代码中使用这些新特性呢?
我有一个简单的示例,演示了按顺序调用 AJAX 请求的缓冲类。(下一个请求在上一个请求完成后开始执行。)
/* Class: Buffer
* methods: append
*
* Constructor: takes a function which will be the task handler to be called
*
* .append appends a task to the buffer. Buffer will only call a task when the
* previous task has finished
*/
var Buffer = function(handler) {
var tasks = [];
// empty resolved deferred object
var deferred = $.when();
// handle the next object
function handleNextTask() {
// if the current deferred task has resolved and there are more tasks
if (deferred.isResolved() && tasks.length > 0) {
// grab a task
var task = tasks.shift();
// set the deferred to be deferred returned from the handler
deferred = handler(task);
// if its not a deferred object then set it to be an empty deferred object
if (!(deferred && deferred.promise)) {
deferred = $.when();
}
// if we have tasks left then handle the next one when the current one
// is done.
if (tasks.length > 0) {
deferred.done(handleNextTask);
}
}
}
// appends a task.
this.append = function(task) {
// add to the array
tasks.push(task);
// handle the next task
handleNextTask();
};
};
我正在寻找 .Deferred
和 .when
的示例和可能的用途。
如果能提供 ._Deferred
的示例就更好了。
链接到新的jQuery.ajax
源文件以获取示例是不允许的。
我特别感兴趣的是,在抽象化操作是否同步或异步完成时可用的技术。
._Deferred
只是.Deferred
使用的真正的“延迟对象”。它是一个内部对象,你很可能永远不会需要它。 - David Tang