1

私はjQueryの遅延機能の利点を理解しようとしてきました。私が正しく理解している場合、Deferredはコールバックの代替手段を提供しませんが、コールバックのより良い管理を提供しますか?メソッドを作成していて、別のタスクを実行する前に実行が終了したことを確認したい場合でも、deferred.resolve?を設定するためのコールバックが必要になります。これが私が正しいと思うことを説明するためのコード例です:

これは親関数です。デフォルトを選択する前に、 「 PASSWORDsToList 」が完了していることを確認したいと思います。(これは実際の関数ではなく、単なる例です)。

function PopulateListAndSelectDefault(list,default)
{
   var resultObject = AddItemsToList($('#myList'), list);

   successObject.Success(function(){
      SelectItemInList($('#myList'), default);
   });
}

これは、' PASSWORDsToList '関数を記述するための誤った方法になります。

function AddItemsToList (jquerySelectList,items)
{
   var result= $.Deferred();
   $.each(items, function (i, _property) 
   {
      if (CheckElementIsSelectList(_property.Value)) 
      {
          jQueryListItem.append($("<option></option>").attr("value", _property.value).text(_property.DisplayText)); //Add Item
      }
   }
   result.resolve;
   return result;      
}

代わりに、正しい方法は、コールバックを引き続き使用することですが、今回は遅延オブジェクトのみを解決して、必要に応じて後で成功/失敗メソッドをアタッチできるようにしますか?

私は正しく理解しましたか?上記のコードを書く正しい方法は何でしょうか、それとも私は基本を完全に誤解していましたか?前もって感謝します。

4

1 に答える 1

1

これは、非同期関数に最も役立ちます。これは、コールバックを管理するためのユーティリティクラスです。

jQuery.Deferred()は、複数のコールバックをコールバックキューに登録し、コールバックキューを呼び出し、同期関数または非同期関数の成功または失敗の状態を中継できるチェーン可能なユーティリティオブジェクトです。

   

jQuery.Deferred()は、複数のコールバックを提供する柔軟な方法を提供します。これらのコールバックは、元のコールバックディスパッチがすでに発生しているかどうかに関係なく呼び出すことができます。

$.Deferred非同期関数での、の正しい使用法は、を返すことpromiseであり、非同期操作が実行されるとresolve、Deferredを返します。

任意の値(おそらく関数の結果)を.resolve()に渡すと、登録されたコールバックがその値を受け取ります。

例:

function getSomething() {
    var deferred = new $.Deferred;
    $.get('/get-something', function(data) {
        deferred.resolve(data);
    });
    return deferred.promise();
}

myAsynchronousFunction().done(function(data) {
    // ...
});

この場合、これは次と同等です。

function getSomething(callback) {
    $.get('/get-something', function(data) {
        callback(data);
    });
}

myAsynchronousFunction(function(data) {
    // ...
});
于 2011-09-07T11:21:46.977 に答える