jquery自定义延迟函数
jquery custom deferred functions
我有三个函数正在尝试运行,前两个函数正在做一些异步的事情,需要数据供第三个函数使用。我希望第三个函数只有在1和2都完成时才启动。这是一般的结构,但最终的功能是在1和2结束之前发射。
function run() {
var data1 = {};
var data2 = {};
$.when(first(), second()).done(constructData());
function first() {
var d = new $.Deferred();
//do a bunch of stuff async
data1 = {};
d.resolve();
}
function second() {
var d = new $.Deferred();
//do a bunch of stuff async
data2 = {};
d.resolve();
}
function constructData() {
//do stuff with data1 and data2
}
}
答案是不立即调用构造数据
$.when(first(), second()).done(constructData);
您应该返回promise对象。您在这一行中也有一个错误:
$.when(first(), second()).done(constructData());
应该是
$.when(first(), second()).done(constructData); // don't call constructData immediately
所以综合起来可能是:
function run() {
var data1 = {};
var data2 = {};
$.when(first(), second()).done(constructData);
function first() {
return $.Deferred(function() { // <-- see returning Deferred object
var self = this;
setTimeout(function() { // <-- example of some async operation
data1 = {func: 'first', data: true};
self.resolve(); // <-- call resolve method once async is done
}, 2000);
});
}
function second() {
return $.Deferred(function() {
var self = this;
setTimeout(function() {
data2 = {func: 'second', data: true};
self.resolve();
}, 3000);
});
}
function constructData() {
//do stuff with data1 and data2
console.log(data1, data2);
}
}
http://jsfiddle.net/FwXZC/
我认为应该让first()
和second()
返回一个promise:return d.promise();
。来自文档:
如果一个参数被传递给jQuery.when,并且它不是Deferred或Promise,那么它将被视为已解析的Deferred,并且任何附加的doneCallbacks都将立即执行。
我怀疑这可能是when
调用调用constructData
太早的原因。
很难从代码中判断出来,但请确保在异步操作完成后调用d.resolve()
。
您可能会发现,显式设置data1
和data2
的一种更自然的方法是使用调用resolve
时提供的数据。这意味着你的when
呼叫看起来像这样:
$.when(first(), second()).done(function(result1, result2) {
data1 = result1[0];
data2 = result2[0];
constructData();
});
请注意,提供给done
方法的结果的确切格式取决于延迟对象的性质。如果promise是从对$.ajax
的调用返回的,那么结果的形式应该是[data, statusText, jqXhrObject]
。
相关文章:
- onclick函数需要双击,因为类分配延迟
- 为JS函数添加延迟
- JavaScript/jQuery-添加添加和删除类与下一个函数之间的延迟
- 从另一个函数延迟解析的返回
- JQueryAJAX:防止由于设置间隔函数而导致的延迟
- 如何延迟函数
- 如何在 JS 中调用 2 次或更多次时延迟函数执行
- jQuery/Javascript 延迟函数的执行,直到多个函数完成
- jQuery 延迟使用一系列函数
- 如何按顺序调用延迟函数
- 使用promise或setTimeout确定延迟函数的调用顺序
- 将函数延迟到$可用
- jQuery/Javascript函数延迟运行,直到另一个函数完成(如果需要)
- JQuery animate() 函数延迟且运行缓慢
- Highchart's选择函数延迟更新
- 加载第二函数延迟
- 由于异步函数延迟执行和完成,变量返回预定义值
- 如何应用setTimeout函数延迟bubbleSort算法
- 如何在marrionete.js中构建一个调用链来渲染itemView,并在itemView中使用async函数延迟
- 如何在窗口加载javascript函数.延迟一段时间后加载