1

のjQueryドキュメントによるとdeferred.promise([target])

target が指定されている場合、deferred.promise() はメソッドをそれにアタッチし、新しいオブジェクトを作成するのではなく、このオブジェクトを返します。これは、Promise 動作を既存のオブジェクトにアタッチするのに役立ちます。

私が理解しているように、ターゲットを呼び出すpromise()と、ターゲットの既存の promise インターフェイスを置き換える必要があります。その場合、次のログが記録されると予想されます"new done"

var defer = $.Deferred();

defer.done(function() { 
    console.log('new done')
});

defer.promise( 
    $.getJSON('/foo').done(function() { 
        console.log('old done')
    })
);

しかし、私はまだターゲットの元のdoneコールバックを取得しています。(jQuery 1.8.3 を使用)

私の理解は完全に間違っていますか、それともオブジェクトのプロミスインターフェース全体を何らかの方法で置き換える方法はありますか?

4

1 に答える 1

1

その getJSON 呼び出しの約束ベースのインターフェースを置き換えていますが、その置き換えは、リクエストを開始し、「古い完了」コールバックを既にアタッチした後に発生しています。また、元の getJSON deferred は、リクエストが完了したときに解決されるものであり、それが発火している理由であり、あなたのものはそうではありません。

試みていることを達成するには、コールバックをアタッチする前にインターフェイスを置き換える必要があります。また、リクエストが完了したときに提供している deferred を手動で解決する必要があります。

通常、次のようなものが機能します。

var deferred = $.Deferred();
var request = $.getJSON( "url" );

request.then(
  function() {
    deferred.resolveWith( this, arguments );
  },

  function() {
    deferred.rejectWith( this, arguments );
  }
);

// Now it's safe to replace the promise methods on the request
deferred.promise( request );

// This callback is being attached to the Deferred we provided,
// not the one managed internally by getJSON
request.done(function() {
    console.log( "Done!" );
});

このメソッドは、.done、.fail、および .always に対してのみ安全です。他の非推奨の遅延ハンドラー ( success、error、complete ) は、必要に応じて修正するのは難しくありませんが、この例では処理されません。

于 2013-02-23T07:14:19.833 に答える