2017-02-21 66 views
0

我想获得“记录”,其中每个包含“字段对象”(每个具有属性.name,.value和.fid)数组的数组。返回数组的对象与延迟

每个记录数组通过API调用通过对数据库的AJAX调用获得。

我希望能够通过一些其他代码在后面进行迭代,但是,目前,我正在试图获取数组的结果数组。

我会说实话,我和如何与承诺做到这一点挣扎......

如果我这样做同步我会用一种向循环,并在每次迭代推到一个数组,但异步造成我的问题...

我现在的代码如下。这将返回一个单独的字段数组,而不是一个数组数组。我想我需要将每个'thisArray'推送到另一个阵列。任何人都愿意帮助?:

注:

ridList是DB记录ID的简单数组,例如: “391”, “392”, “393”, “394”, “395”,“ 398“,”399“,”400“,”396“,”397“,”437“]

AVMI_db是AJAX调用从其获取数据的URL。

/////////////////////////////////////////////////////////////// 
// Get record info for each array member 
/////////////////////////////////////////////////////////////// 
function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) { 
    var promises = []; 

    $.each(ridList, function (index,value) { 
     var def = new $.Deferred(); 
     var thisArray = []; 
     $.get(AVMI_db, { //******* ITERATIVE AJAX CALL ******* 
      act: 'API_GetRecordInfo', 
      rid: value 
     }).then(function(xml2) { 
      $(xml2).find('field').each(function() { 
       var $field = {}; 
       $field.fid = $(this).find('fid').text(); 
       $field.name = $(this).find('name').text(); 
       $field.value = $(this).find('value').text(); 
       thisArray.push($field); 
      }); 
      def.resolve(thisArray); 
     }); 
     promises.push(def);  
    });  

    return $.when.apply(undefined, promises).promise(); 
}; 
+0

不是一般的重复,但你可能会在这里找到你的答案,因为有诺言大量的信息和递延:http://stackoverflow.com/questions/14220321/how-do-i-return-the-来自异步电话的响应/ 14220323 –

回答

0

您可以创建一个数组是从迭代遍历这些调用并在承诺执行后将数组返回时填充。

function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) { 
var promises = []; 
var returnValue = []; // to be returned by the promise 
$.each(ridList, function (index,value) { 
    var def = new $.Deferred(); 
    var thisArray = []; 
    $.get(AVMI_db, { //******* ITERATIVE AJAX CALL ******* 
     act: 'API_GetRecordInfo', 
     rid: value 
    }).then(function(xml2) { 
     $(xml2).find('field').each(function() { 
      var $field = {}; 
      $field.fid = $(this).find('fid').text(); 
      $field.name = $(this).find('name').text(); 
      $field.value = $(this).find('value').text(); 
      thisArray.push($field); 
     }); 
     returnValue.push(thisArray); 
     def.resolve(thisArray); 
    }); 
    promises.push(def);  
});  

return $.when.apply(undefined, promises).then(function() { 
    return returnValue; 
}).promise(); 
}; 
+0

谢谢,这是我基本上做的。出于某种原因,我只是在想法上碰壁。非常感谢...! –

0

也许我在这里错过了一些东西,如果我不明白你想要什么,请随时发表评论。我承诺你想获得一个数组而不是一个数组的字段。为此,您在自己的问题中给出了答案:

我想我需要将每个'thisArray'推送到另一个数组。

但什么困扰我,让我觉得我可能误解的东西,就是如果你能做到代码有点复杂,因为这,我想你可以做出一个简单的变化为(或做你有这代码的地方),但无论如何... 我不能对此进行测试,因为我必须创建整个API调用,但它应该是这么简单:

/////////////////////////////////////////////////////////////// 
// Get record info for each array member 
/////////////////////////////////////////////////////////////// 
function AVMI_getMultipleRecordInfoFromArray(ridList, AVMI_db) { 
    var promises = []; 

    $.each(ridList, function (index,value) { 
     var def = new $.Deferred(); 
     var thisArray = []; 
     $.get(AVMI_db, { //******* ITERATIVE AJAX CALL ******* 
      act: 'API_GetRecordInfo', 
      rid: value 
     }).then(function(xml2) { 
      $(xml2).find('field').each(function() { 
       var $field = []; 
       $field.push($(this).find('fid').text()); 
       $field.push($(this).find('name').text()); 
       $field.push($(this).find('value').text()); 
       thisArray.push($fields); 
      }); 
      def.resolve(thisArray); 
     }); 
     promises.push(def);  
    });  

    return $.when.apply(undefined, promises).promise(); 
+0

谢谢Nelson。不要引用我之后的内容,但我感谢您的帮助!事实上,这很简单,但是,由于某种原因,我只是看不到它... –

+0

@DavidStewart不客气。如果答案有帮助,请立即投票。谢谢:) –