2

2つの関数があり、それらの間で同期したい最初の関数は非同期関数です。最初の関数から結果を取得したときにのみ、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のロジックが実行されないという問題が発生すると、alert(1)が発生します。

更新機能が終了し、d3.jsonからのデータが得られた場合にのみ、alert(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

また、コールバックの外で promise を返す必要があります。

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

your problem is due to the asynchronous nature of d3.json() call, i.e.execution of lines after function call is not wait to complete the d3.json() function. you can fixed this problem by using delay method. use delay and try to halt execution for few second just after json call..

于 2014-05-15T10:53:38.907 に答える