0

私は jQuery $.Deferred を使用したことがなく、これまでのところ、理解できる例を見つけていません。

必要なのは、ステップ 1、ステップ 2、ステップ 3 の 3 つの別々のタスクを順番に実行できるようにすることです。ステップ 2 はステップ 1 が完了するのを待ち、ステップ 3 はステップ 2 が完了するのを待ってから実行する必要があります。

私は次のことを試みていますが、どこかに行っているようです:

        var construct = new $.Deferred();

        construct.done(function() {
            console.log('Step 1');
        });

        construct.done(function() {
            setTimeout(5000);
            console.log('Step 2');
        });

        construct.done(function() {
            console.log('Step 3');
        });

        construct.resolve();

フィドルで簡単に作業できる人はいますか?

4

2 に答える 2

2

そのように をチェーンするにDeferredは、 を使用してthen、新しい を返す必要がありDeferredます。

var construct = $.Deferred();

construct.then(function() {
    console.log('Step 1');
})
.then(function() {
    return $.Deferred(function (dfd) {
        setTimeout(function () {
            console.log('Step 2');
            dfd.resolve();
        }, 5000);
    });
})
.then(function() {
    console.log('Step 3');
});

construct.resolve();

これがフィドルです:http://jsfiddle.net/fMMsz/

于 2013-06-05T00:31:12.310 に答える
0

私は非同期操作のためにしばらく前に行に沿って何かを書きましたが、順番にそれが必要な場合は、このようなものを試すことができます. setInterval長時間実行される操作をシミュレートする必要があります。

この背後にある考え方は、Deferred呼び出された関数ごとにオブジェクトを返すことです。これは、返された結果に基づいて動作するようにdone定義されたコールバックに指示します。fail

JSフィドル

var loadQueue = function() {
    var dfrQueue1 = new $.Deferred();
    var i = 0;
    var loop = window.setInterval(function() {
      ++i;
      console.log('queue 1 - running: '+i);
      if (i >= 10) {
         // pass optional param to success callback
         dfrQueue1.resolve('queue 1'); 
         clearInterval(loop);
      }
    }, 1000);

    console.log('initiating queue 1');
    return dfrQueue1.promise();
};

var loadQueue2 = function() {
    var dfrQueue2 = new $.Deferred();
    var i = 0;
    var loop = window.setInterval(function() {
      ++i;
      console.log('queue 2 - running: '+i);
      if (i >= 5) {
          // pass optional param to success callback
          dfrQueue2.resolve('queue 2');
          clearInterval(loop);
      }
    }, 1000);

    console.log('initiating queue 2');
    return dfrQueue2.promise();
};

var t = loadQueue().done(loadQueue2);
于 2013-06-05T00:38:01.430 に答える