我有这样的代码:
$.when(makeDiv()).then(generateImg2());
我用它来调用这些函数:
full
这会生成一个空白PDF,因为代表#full_complete
的{{1}}尚未完全创建。这就是为什么我希望使用回调,但它显然无法正常工作,因为这两个函数基本上同时触发。
我在这里做错了什么?我猜它是如何设立承诺的,但不知道如何解决它。
答案 0 :(得分:1)
Deferred
允许您进行异步操作。为此,将内部函数包含在setTimeout
内以完全模仿异步操作:
function makeDiv(callback){
var dfd = jQuery.Deferred();
setTimeout(function() {
$("#full_complete").append($(dose_credit).html()+ " " +$(storyboard).html() + " " +$(nar_name).html() + " " +$(nar_text).html());
full = $(this).closest('div').find("#full_complete");
dfd.resolve( "hurray" );
}, 0);
return dfd.promise();
}
这样做,您将在解决之前返回promise
。
有一种替代方法可以利用承诺的链接性质:
function makeDiv(callback){
var dfd = jQuery.Deferred();
setTimeout(function() {
dfd.resolve( "hurray" );
}, 0);
return dfd.promise();
}
makeDiv().then(function(result) {
console.log(result); //hurray
$("#full_complete").append($(dose_credit).html()+ " " +$(storyboard).html() + " " +$(nar_name).html() + " " +$(nar_text).html());
full = $(this).closest('div').find("#full_complete");
});
更进一步,您可以编写一个帮助程序来确保代码的async
性质:
function async(){
var dfd = jQuery.Deferred();
setTimeout(function() {
dfd.resolve();
}, 0);
return dfd.promise();
}
async().then(function() {});