2012-08-28 62 views
2

我有两个函数,我想在它们之间同步 第一个函数是异步函数。 只有当我从第一功能我要打电话到第二功能 得到的结果我想这个代码如何同步异步函数与延迟jquery

$.when(update().then(function (data) { 
     alert(1); 
     $.when(func1(),func2()).then(function(dataFunc1,dataFunc2) {}); 
     }); 

    update : function(){ 

      var dfd = $.Deferred(); 
      d3.json("test.json", function(json) { 
        var data = createData() 
        dfd.resolve(data); 
        return dfd.promise(); 
     }}; 

问题,该更新被称为然后打电话给D3,JSON和不做d3的逻辑,json因为它是异步函数,所以alert(1)被提升。

我认为只有当更新函数完成后,我才会有d3.json的数据,然后警报(1)会提升。

我错过了什么吗? 我也读reslove和承诺,我需要使用reslove只有当我需要传递参数?当我需要使用诺言时?

回答

4

我掐灭你的功能,修正了一些语法错误,并能正常工作:

$.when(update()).then(function (updateData) { 
    console.log(updateData); 

    $.when(func1(),func2()) 
    .then(function(dataFunc1, dataFunc2) { 
     console.log(dataFunc1 + ' ' + dataFunc2);   
    }); 
}); 

http://jsfiddle.net/RBS5V/

中最突出的问题是在第一行语法错误:

$.when(update()).then(function (data) { 
//   ^missing closing parenthesis 

此外,您需要在任何回调之外回复您的承诺:

update: function(){ 
    var dfd = $.Deferred(); 

    d3.json("test.json", function(json) { 
     var data = createData() 
     dfd.resolve(data); 
     // dont return a promise here 
    }}; 

    // return it out here 
    return dfd.promise(); 
} 
+0

的逻辑决心和承诺有什么不同? – user1365697

+0

@ user1365697'resolve'的意思是“告诉谁在等待这件事完成它已经完成”,'promise'是一个令牌给你的消费者,这样他们就可以听到这个决心。 – jbabey

+0

我需要使用它们吗? – user1365697

1

我不确定你做错了什么,你的代码看起来像是有语法错误。

我restrucutured它:

$.when((function() { 
    var dfd = $.Deferred(); 
    d3.json("test.json", function(json) { 
     var data = createData() 
     dfd.resolve(data); 
    }); 
    return dfd.promise(); 
}())).then(function (data) { 
    alert(1); 
    $.when(func1(),func2()).then(function(dataFunc1,dataFunc2) { 
     alert(2); 
    }); 
}); 

这应该工作。

+0

它没有工作,它仍然得到的d3.json代码没有做逻辑先警报(1)提高,然后继续做d3.josn – user1365697

0

你的问题是由于d3.json()调用的异步性质造成的,即函数调用之后执行的行不是等待完成d3.json()函数。你可以通过使用延迟方法来解决这个问题。使用延迟,并尝试暂停执行几秒钟后,json致电..