我在使用jQuery的$ .when()。done()函数时遇到了一些问题。有人可以帮忙吗?当我有ajax调用和非ajax调用方法时,即使我使用$ .when()。done(),也会调用非ajax调用。请参阅下面的代码段。方法/功能三正在运行。
$(document).ready(function () {
Initial();
});
function Initial() {
debugger;
var emp = { Name: "Ram", Age: 10 };
Main(emp);
}
function Main(em) {
$.when(One(em)).done(Two(em)).done(Three(em.Name));
}
function One(et) {
//some ajax call
console.log("One");
}
function Two(et) {
//some ajax call
console.log("Two");
}
function Three(et) {
console.log(et);//not an ajax call
console.log("Three");
}
修改
下面是Vohuman修改之后的代码片段,它像魅力一样工作
$(document).ready(function () {
Initial();
});
function Initial() {
debugger;
var emp = { Name: "Ram", Age: 10 };
Main(emp);
}
function Main(em) {
var def1 = $.Deferred();
var def2 = $.Deferred();
One(em, def1);
Two(em, def2);
$.when(def1, def2).done(function () {
Three(em.Name)
});
}
function One(et, defObj) {
//some ajax call
if (defObj) {
defObj.resolve();
}
console.log("One");
}
function Two(et, defObj) {
//some ajax call
if (defObj) {
defObj.resolve();
}
console.log("Two");
}
function Three(et) {
console.log(et);//not an ajax call
console.log("Three");
}
答案 0 :(得分:2)
()
称为调用运算符。它调用一个函数。这意味着你自己调用函数,并且函数的返回值被设置为回调,而不是函数本身。
$.when(One(em)).done(Two).done(Three);
如果你想用参数调用回调,你应该使用中间件,即另一个函数。
function Main(em) {
$.when(One(em)).done(function() {
Two(em);
}).done(function() {
Three(em.Name);
});
}
另请注意,如果要发送多个ajax请求并在所有请求完成后执行回调,则可以将多个延迟对象传递给$.when
:
$.when(deferredOne, deferredTwo).then(function(resolvedValueOne, resolvedValueTwo) {
});
作为建议,不要将PascalCase名称用于常规函数。按照惯例,在JavaScript中,PascalCase名称用于命名构造函数和类。
答案 1 :(得分:0)
另一种做法是
$.when(One(em), Two(em)).done(function( a1, a2 ) {
Three(em.Name)
});
但是One和Two方法必须返回promise对象。