1

次の構造を持つ次のコードがあります。

doSomething '/', ->
  waitForthis '#e', ->
    waitForSomethingElse '#el', ->
      #actually do it

deferreds/promise を次のように使用したい場合:

doSomething().then(waitForthis).then(waitForSomethingElse);

どこで遅延を作成し、それぞれが約束を返すでしょうか?

始めるための大まかなアドバイスを探しています。

これにはおそらく jquery deferreds を使用します。

4

3 に答える 3

0

このようなもの:

doSomething().then(waitForthis).then(waitForSomethingElse);

むしろそうなるだろう

doSomething('/').then( function() {
    return waitForthis('#e');
}).then( function() {
    return waitForSomethingElse('#el');
});

または、 を使用します.bind()

どこで遅延を作成し、それぞれが約束を返すでしょうか?

はい、各関数は promise を返します。jQuery では、「Deferred」は遅延オブジェクトのコンストラクターです。「promise()」を呼び出すと、addCallback 関数のみを持つオブジェクトが返されますが、トリガー メソッドは公開されません。ドキュメントとその多くの例を確認してください。

于 2012-12-11T01:05:40.650 に答える
0

次のようなものを探している場合:

Send request A
when A returns,
Send request B(result a)
when B returns,
Do C(response b)

次に、それぞれをプロミスにする必要があり、クロージャーに注意を払う必要があります (コールバックからの戻り値を収集できないため)。

a_done = something_that_returns_a_promise();
a_done.then(function (a_result) {
    var b_done = something_that_returns_a_promise(a_result);
    b_done.then(function (b_result) { do_C(b_result); });
});

あなたが何かを探しているなら

Send request A
Send request B

when A && B return,
Do C

次に、いくつかのプロミスを取り、プロミスを返す関数を見ています。

a = something_returning_a_promise();
b = something_returning_a_promise();
a_and_b_done = when(a, b);

a_and_b_done.then(function (result1, result2) { do_c(result1, result2); })
            .then(show_results);

のようなことをする

a_done.then(fillRows).then(showResults);

複数の非同期呼び出しを行うことはできません... ...一連の同期タスクを次々に連鎖させることができます (または、到着する順序がまったく問題にならない非同期呼び出しを行うことができます)。 .

.then

また

.done

または何でも、特別なことは何もしません-タスクを配列に追加します。
async promise が返されると (または既に返されて解決されている場合)、そのリストを順番に調べて、すべてのコールバックを起動し、解決されたデータを渡します (そして、「成功」または「失敗」を呼び出します) " 操作の成功に基づくコールバック)。

したがって、非同期コールバックごとに 1 つの promise が必要です。また、コールバックを連鎖させようとする場合でも、それぞれをクロージャ (次の promise を構築するものに結果を渡すクロージャ) 内にラップする必要があります。

ここでは jQuery $.Deferred()deferred.promise()deferred.resolve()、を使用しています。 他のライブラリでは用語が異なる場合がありますが、同様に動作します。deferred.reject()promise.done()promise.fail()$.when()

var ImageLoader = function (name, format) {
    var loading = $.Deferred(),

        img = new Image(),
        url = name + (format || ".png");

    img.onload = function () {
        loading.resolve(img);
    };

    img.onerror = function () {
        loading.reject("Image failed to load:" + name);
    };

    img.src = url;

    return loading.promise();
};


var imgLoaded = ImageLoader("//mysite.com/myimg");

imgLoaded.done(function () { console.log("img 1 loaded"); });
imgLoaded.fail(function (msg) { console.log(msg); });

var img2Loaded = ImageLoader("//yoursite.com/yourimg", ".jpg");
img2Loaded.done(function () { console.log("img 2 loaded"); });
img2Loaded.fail(function (msg) { console.log(msg); });


var showImages = function (img1, img2) {
    document.body.appendChild(img1);
    document.body.appendChild(img2);
};

var both_loaded = $.when(imgLoaded, img2Loaded);
both_loaded.done(showImages);

これは厄介で複雑な例ですが、エレガントにするのではなく、すべての部分を示す方法で記述しようと考えました。

于 2012-12-11T00:17:44.377 に答える
0

(jQueryを想定)

連鎖を確実にするために、各ステップは promise を返す必要があります。

それが then() の機能なので、ここでは問題ありません。

doSomething() も promise を返す必要があります。これを行うには、doSomething() で deferred を作成し、その promise を返します。

一部の jQuery 関数には既に deferred が含まれており、then() を使用してそれらを直接連鎖させることができます。例えば:

$.ajax(...).then(...)

詳細と実際の例については、この記事をご覧ください。

于 2012-12-10T23:28:12.703 に答える