2016-03-11 65 views
0

我有这样的代码:回调/承诺不正常工作

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代表#full_complete不完全创建。这就是为什么我希望使用回调,但它显然不工作,因为这两个功能基本上同时触发。

我在这里做错了什么?我猜这是我如何设定承诺,但不知道如何解决它。

+2

有没有按” t似乎是异步进行的任何事情都需要一个承诺,添加到DOM的元素是同步的,至少如果你丢弃DOM就绪处理程序。 – adeneo

+0

愚蠢的问题,但你有没有在'doc.fromHTML'中打断你的代码,看看'full'是否被加载? –

+0

@The_Black_Smurf我只是通过查看'full'的'html()'看起来是什么样,并且它已经在'doc.fromHTML'之前完全加载了。 – jonmrich

回答

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() {});