2

私はdeferredsを実装する小さなスクリプトに取り組んでおり、Javascriptが期待するように動作していないこの小さなコードに出くわしました。

var dfd = $.Deferred()
  , view  = $.get("filename.tmpl");

$.get("filename.json")
  .always(function (model) {
    dfd.resolve(model);
  });

$.when(view, dfd)
  .done(function (view, model) {
    // do stuff with view - even if there is no model
  });

これは正常に機能しますが、これにリファクタリングすると機能しなくなります。

var dfd = $.Deferred()
  , view  = $.get("filename.tmpl");

$.get("filename.json").always(dfd.resolve);

$.when(view, dfd)
  .done(function (view, model) {
    // do stuff with view - even if there is no model
  });

これが機能しない理由はわかりません。関数は、最初の引数がモデルまたは未定義であることを期待しています。

4

1 に答える 1

2

これを行うとき:

$.get("filename.json").always(dfd.resolve);

これの代わりに:

$.get("filename.json")
  .always(function (model) {
    dfd.resolve(model);
});

thisメソッドのポインタとして渡される別のオブジェクトを取得しますresolve()。2番目はのコンテキストでそれを呼び出しますdfd。最初のものは、それをあなたから返された遅延オブジェクトのコンテキストと呼びますが、$.get()これは異なります。

dfd.resolveコールバックを渡すときは、メソッドへのポインタを取得するだけであることを覚えておくことが重要です。呼び出されるコンテキストは設定されませんresolve.always()これは、メソッドの内部で設定されます。

于 2012-09-06T23:35:23.620 に答える