0

私は理解しようとしています$.when(...).then(...).done(...)。これは単なるテストです。

HTML:

<p id="phrase"></p>
<button id="btn">get phrase</button>

JavaScript:

var p = $('#phrase');

function displayResult(o){
    console.log(o);
    p.append(o + ' ');
};

function getSubject(){
    console.log('getSubject');
    return $.get(
    'sujet.js', //returns "the quick brown fox"
    displayResult
    );
}

function getVerb(){
    console.log('getVerb');
    return $.get(
    'verbe.js',//returns "jumps over"
    displayResult
    );  
}

function getComplement(){
    console.log('getComplement');
    return $.get(
    'complement.js', //returns "the lazy dog"
    displayResult
    );
}

function close(){
    p.append("!!!");
}

function load(){
    $.when(getSubject())
    .then(getVerb)
    .then(getComplement)
    .done(close);
}

$('#btn').click(load);

私が理解しているように、次のようにする必要があります。

  1. request forsujet.jsで、段落に文字列を表示します。
  2. request forverbe.jsで、段落に文字列を表示します。
  3. request forcomplement.jsで、段落に文字列を表示します。
  4. 「!!!」を追加 段落に。

取得するだけsujet.jsです。が呼び出されることはなく、およびdisplayResultに渡される関数も呼び出されません。thendone

だから、私はおそらく何かを誤解しました。

この回答から例を取得しました。

編集

$.when私の問題は、 orとは関係のない解析エラーでした$.then。修正すると、残りは期待どおりに機能しました。ただし、それがどのように機能するかをよく説明しているので、私は megar の答えを受け入れたものとしてマークしました。

4

3 に答える 3

2

$.when(...).then(...).done(...)は不要であり、 は必要なく、チェーンを で終了する必要もない という意味で、問題ではありません。promise を返す関数を と一緒にチェーンし、ハンドラーを追加するだけです。whenthendonethenfail

getSubject()
.then(getVerb)
.then(getComplement)
.then(close)
.fail(function () {
  console.log("One of the functions failed");
});

a を省略するfailと、基本的に、成功/失敗のコールバックよりも deferred を使用する利点がすべて失われることに注意してください: 1 つの統一されたエラー処理メソッドを使用して、任意のレベルから失敗を「キャッチ」します。

于 2013-08-09T20:38:20.487 に答える
1

この部分は、前の関数呼び出しによって返された/オブジェクトが-d または-edに.then()なるたびにのみ呼び出されます。エラーで終了した場合、解決または拒否されない場合、関数呼び出しは永遠に待機します。ご覧のとおり、関数内の ajax 呼び出しが異常終了したと想定しています。そうであるかどうかを確認するには、関数チェーンにハンドラーを追加するだけです。$.Deferredpromistresolve()reject()$.get.then()$.getgetSubject().fail()

$.when(getSubject())
    .then(getVerb)
    .then(getComplement)
    .done(close)
    .fail() {
         console.log('An error occured.');
    });
于 2013-08-09T20:44:57.313 に答える