2013-01-15 90 views
0

使用回調,我有以下的代碼jquery如何在這種情況下推遲工作?

var TK = { 
    List: [], 
    getSectionA: function(listName, callback) 
    { 
     var arrayList = []; 
     $.get('ajax/test.html', {sendName: listName}, function(data) { 

       $.each(data, function() 
       { 
        arrayList = data; 
       }); 
     callback(arrayList); 
     });  

    } 

}; 

調用函數

$("#dropDownList").change(function() 
    { 
     TK.getSectionA(fileName, function(data) 
     { 
      TK.List = data; 
      alert(TK.List); // This works ok... 
     }); 

      alert(TK.List); // This does not work when calling using this property outside the callback.. 
    }); 

我如何能得到這個回調函數是在另一個函數外面工作

+0

第二次警告_cannot_工作。你__有點等待 –

+0

@JanDvorak這就是問題的全部要點 – Popnoodles

+0

@popnoodles你是否建議我發佈這個答案? –

回答

1

jQuery的獲得()函數返回promise接口,允許您添加儘可能多的函數,以便處理get()成功完成(done())或失敗(fail)或完成任一方式(always())。

承諾接口與延遲相同,但只有「只讀」方法,因此您不能干涉過程,但可以看到會發生什麼。

如果返回的承諾,它可以用來做任何你想要的:

var TK = { 
     List: [], 
     getSectionA: function(listName, callback) 
     { 
      var arrayList = []; 
      return $.get('ajax/test.html', {sendName: listName}, function(data) { 

        $.each(data, function() 
        { 
         arrayList = data; 
        }); 
      callback(arrayList); 
      });  

     } 

}; 

調用它是這樣的:

TK.getSectionA(fileName, function(data) 
     { 
      TK.List = data; 
      alert(TK.List); // This works ok... 
     }).always(function() { 
      alert("Get ended: " + TK.List); 
     }); 

您可以http://api.jquery.com/jQuery.ajax/此頁面上閱讀,但有跳到一個有「承諾」的段落。

+0

這是否意味着我現在可以在代碼中的任何位置使用TK.List更新的數組信息?例如,我需要在代碼中的其他地方使用TK.List ... –

+0

@YetimworkBeyene只在回調到「always」或「done」;否則你可能會試圖快速訪問'TK' –

+1

Lee,爲什麼不直接鏈接到http://api.jquery.com/category/deferred-object/? –

相關問題