0

私はいくつかの annc に取り組んでおり、それを良い方法で実装したいと思っています。

次のコードを検討してください

function getData(latency) {
    var deferred = $.Deferred();

    window.setTimeout(function () {
        deferred.resolve(Math.random());
    }, latency + 100);

    return deferred.promise();
}
function getSpecialData() {
    var deferreds = [];
    for (var i = 0; i < 3; i++) {
        deferreds.push(getData(1000 * i));
    }
    return $.when.apply($, deferreds);
}

function log(msg) {
    $("#console").append("<li>" + msg + "</li>");
    console.log(msg);
}

getData(3000)
.done(function () {
    log("got 3000 data");
    return getSpecialData()
    .done(function () {
        log("got special data");
    });
})
.always(function () {
    log("got all data");
});

ご覧のとおり、getData 関数と getSpecialData 関数の両方から promise を返しています。また、ご覧のようにこれらの関数への呼び出しを連鎖させています。さらに、getData done コールバック内から promise を返しています。

私は、遅延オブジェクトがそのコールバックが返すものを気にかけ、それが約束である場合は、その約束が解決されるのを待ってから、別のコールバックを待つことを期待していました。実際に起こっていることは、コールバック内から何を返すかを気にしないということです。順序は次のとおりです。

  1. getData を呼び出し、3 秒間"got 3000 data"情報を取得した後、
  2. 同時に getSpecialData とメッセージ付きのalwaysコールバックを起動します"got all data"

私が達成したいのは、次の関数呼び出しの順序です。

  1. getData を呼び出し、3 秒間"got 3000 data"情報を取得した後、
  2. getSpecialData を呼び出し、3 秒後に"got special data"情報を取得し、
  3. "got all data"メッセージの直後。

私が望むように動作させるための最良のアプローチは何ですか?

4

2 に答える 2

1

それはまさに.then()(または.pipe()jQuery 1.8 より前の) 機能です。

の代わりにそれを呼び出し.done()ます。

于 2013-10-11T14:07:48.167 に答える
0

それは意味がないため、コールバックからは何もできませんreturn-結果は呼び出し元のどこにも使用されず、そのタイプは実質的にvoid.

thenアクションを連鎖するには、の代わりに使用できますdone。このメソッドは、コールバックの (非同期) 結果の promise を返します。これは、それ自体が promise になる場合があります。

于 2013-10-11T14:11:12.293 に答える