2011-02-02 115 views
1

調用我有一個jQuery的插件,它可以用一個函數處理作爲數據源如何合併兩個AJAX的結果(或獲得)與jQuery

var plugin = $element.plugin({ 
    data: function (callback) { 
     // TODO 
    } 
}); 

這是非常簡單的,如果我只用一個數據源...
但是...我在需要兩個數據源

我試過到目前爲止的:這個代碼

var plugin = $element.plugin({ 
    data: function (callback) { 
     var path1 = 'foo1.json'; 
     var path2 = 'foo2.json'; 
     var resultOfPath1 = GetContent(path1); 
     var resultOfPath2 = GetContent(path2); 
     var result = /* this is where i am stuck !! */; 
     callback(result); 
    } 
}); 

function GetContent(path) { 
    // this is where i am stuck!! 
    // which method to take? i would like to force a sync. request here 
} 

我的兩個問題:

  1. 如何合併兩個json-lists?
  2. 如何強制同步。請求(或有沒有人有更好的主意嗎?)

回答

2
var plugin = $element.plugin({ 
    data: function (callback) { 
     var path1 = 'foo1.json'; 
     var data1 = {}; 
     var path2 = 'foo2.json'; 
     var data2 = {}; 
     $.getJSON(path1, data1, function (result1) { 
     $.getJSON(path2, data2, function (result2) { 
      var result = new Array(); 
      jQuery.each(result1, function (index, element) { 
       result.push(element); 
      }); 
      jQuery.each(result2, function (index, element) { 
       result.push(element); 
      }); 
      callback(result); 
     } 
     }); 
    } 
}); 
+4

+1鏈接回調,但考慮使用[concat()](https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat)合併數組而不是每個)`循環。 – 2011-02-02 11:31:23

0

是...

有一個全局變量,把你從阿賈克斯得到的數據。

var queue = []; 

$.ajax({ 
url:'blabla', 
success:function(data){ 
    queue += data 
} 
}); 
$.ajax({ 
url:'blabla2', 
success:function(data){ 
    queue += data 
} 
}) 
+1

此解決方案,我需要輪詢`queue`或引入一個旗枚舉請求的`queue`(其操作已經完成)的狀態。 .. – 2011-02-02 11:26:53

1

嘗試:

var plugin = $element.plugin({ 
    data: function (callback) { 
     var 
     paths = ['foo1.json', 'foo2.json'], 
     result = [], 
     countState = 0; 

     $.each(paths, function() { 
      var dataSend = {}; //?? 
      $.getJSON(this, dataSend, function(data) { 

       jQuery.each(data, function (i, el) { 
       result.push(el); 
       }); 

       countState++; 
       if (countState == paths.length) 
       callback(result); 
      }); 
     }); 


    } 
});