2

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

  $.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?

4

3 回答 3

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();
}
于 2012-08-28T13:03:02.533 回答
1

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

我对其进行了重组:

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

这应该有效。

于 2012-08-28T12:53:53.187 回答
0

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

于 2014-05-15T10:53:38.907 回答