我有这样的代码:
function makeDiv(callback){
var dfd = jQuery.Deferred();
$(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" );
})
return dfd.promise();
}
function generateImg2(){
var doc = new jsPDF();
doc.fromHTML($(full).get(0), 15, 15, {
'width': 170,
});
doc.save('Test.pdf');
}
我用它来调用这些函数:
$.when(makeDiv()).then(generateImg2());
这将生成一个空白 PDF,因为表示#full_complete
full
尚未完全创建。这就是为什么我希望使用回调,但它显然不起作用,因为这两个函数基本上同时触发。
我在这里做错了什么?我想这就是我设置承诺的方式,但不确定如何解决它。
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() {});