我不确定我是否正确阅读文档,但我认为$ .when jquery允许我做多个异步调用然后在函数的done
部分,我' d能够调用另一个函数。我基本上是在渲染视图之前尝试获取所有数据。有些项目在骨干对象中,有些项目我必须使用ajax调用手动调用,因为没有与信息对应的骨干对象。
var fetchLibraries = function () {
if (this.screen == "EDIT") {
$.ajax({
url: 'libraries',
type: "GET",
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors
},
success: function (data) {
console.log(data);
// do some processing with the data that can take some time
}
});
}
}
};
$.when(this.platforms.fetch(),
fetchLibraries()).done(function () {
self.trigger('removeOverlay');
self.render();
});
通常情况下,这可以正常工作,并且在fetchLibraries成功回调之后调用我的渲染函数。有时,通常当我的服务器唤醒并且调用需要一段时间时,在完成fetchLibraries的处理之前会调用self.render()。我在self.render函数和成功回调中都有一个console.log,当它不起作用时,我基本上在看到“数据”记录之前看到了“render”。我想知道是否有办法确保fetchLibraries在调用render之前完成它的成功回调。
答案 0 :(得分:1)
传递给when
的方法应该返回一个承诺。
var fetchLibraries = function () {
if (this.screen == "EDIT") {
return $.ajax({ //return the promise
url: 'libraries',
type: "GET",
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors
},
success: function (data) {
console.log(data);
// do some processing with the data that can take some time
}
});
}
};
$.when(this.platforms.fetch(), fetchLibraries()).done(function () {
self.trigger('removeOverlay');
self.render();
});
答案 1 :(得分:0)
如果你这样写会怎么样:
var fetchLibraries = function () {
if (this.screen == "EDIT") {
$.ajax({
url: 'libraries',
type: "GET",
crossDomain: $.support.cors,
xhrFields: {
withCredentials: $.support.cors
}
});
}
};
$.when(this.platforms.fetch(), fetchLibraries()).done(function (data) {
// write success's body here
self.trigger('removeOverlay');
self.render();
});