Javascript 如何在异步函数与延迟jquery之间同步

Javascript 如何在异步函数与延迟jquery之间同步,javascript,Javascript,我有两个函数,我想在它们之间同步 第一个函数是异步函数。 只有当我从第一个函数得到结果时,我才想调用第二个函数 我试过这个密码 $.when(update().then(function (data) { alert(1); $.when(func1(),func2()).then( function(dataFunc1,dataFunc2) {}); }); update : function(){ var d

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

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

这应该行得通。

我打断了您的函数,修复了一些语法错误,它工作正常:

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

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

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

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

您的问题是由于d3.json()调用的异步性质造成的,即函数调用后的行的执行不是等待完成d3.json()函数。您可以使用延迟方法修复此问题。使用delay并在json调用之后尝试暂停执行几秒钟

它没有工作,它仍然到达d3。json代码没有先执行逻辑警报(1)发出,然后继续执行d3的逻辑。josn@user1365697
resolve
的意思是“告诉等待此操作完成的人此操作已完成”,
promise
是您给消费者的令牌,以便他们可以监听解析。我需要同时使用它们吗?@user1365697 yes。当时传递给
的函数应始终返回一个
延迟
承诺
对象,以使其正常工作。我必须使用setTimeout吗?@user1365697否。我使用setTimeout来说明异步延迟。