回调/承诺无法正常工作

时间:2016-03-11 16:30:45

标签: javascript jquery

我有这样的代码:

 $.when(makeDiv()).then(generateImg2());

我用它来调用这些函数:

full

这会生成一个空白PDF,因为代表#full_complete的{​​{1}}尚未完全创建。这就是为什么我希望使用回调,但它显然无法正常工作,因为这两个函数基本上同时触发。

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

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