如何在异步函数与Deferredjquery之间同步
How to sync between asynchronous function with Deferred 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的逻辑,因为它是异步函数,然后引发警报(1)。
我想只有当更新功能完成,并且我将从d3.json中获得数据时,警报(1)才会出现。
我错过什么了吗?我还阅读了关于reslove和promise的文章,我只需要在需要传递参数时使用reslove吗?什么时候我需要使用promise?
我清除了你的函数,修复了一些语法错误,它运行良好:
$.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();
}
我不确定你做错了什么,你的代码看起来有语法错误。
我重新构造了它:
$.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);
});
});
这应该行得通。
您的问题是由于d3.json()调用的异步性质造成的,即函数调用后的行执行不是等待完成d3.json)函数。您可以使用延迟方法来解决这个问题。使用延迟并尝试在json调用后暂停执行几秒钟。。