如何在异步函数与Deferredjquery之间同步

How to sync between asynchronous function with Deferred jquery

本文关键字:Deferredjquery 之间 同步 函数 异步      更新时间:2023-09-26

我有两个函数,我想在它们之间同步第一个函数是异步函数。只有当我从第一个函数得到结果时,我才想调用第二个函数我试过这个代码

  $.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调用后暂停执行几秒钟。。