将ajax响应存储在外部数组中

时间:2016-10-29 09:03:24

标签: javascript jquery ajax

我知道很多关于这个主题的主题已经存在(例如How do I return the response from an asynchronous call?),但目前我处于信息过载的状态,我似乎无法完成它。很多主题都说要使用同步请求,但是因为这是不可取的(并且我的浏览器不再支持这种方式)所以我必须避免这种情况。

问题:

我有一份清单。我想将每个项目传递给ajax请求以收集一些其他信息。结果应该是包含附加数据的新列表。

var list=['a','b','c','d'];
var newlist=[];

for(element in list)
{
var item=list[element];
$.ajax({
    url: "process.php",
    type:"get", 
    data:{content:item} 
    }).success(function(response)
    { newlist.push([item,response]);}
}};
}

我想我现在应该有一个像

这样的清单
newlist=[ ['a','response'],['b','response'],['c','response'],['d','response'] ];

('响应'当然是实际的响应)。然而,这种情况并非如此。当我在成功功能中发出警报以显示其显示的项目时,' d'四次。

我做错了什么?

3 个答案:

答案 0 :(得分:1)

在函数中包装Ajax调用并让它在递归中成功调用。

成功只需在newList数组中从服务器推送结果。

如果服务器的结果为空,则继续执行。

答案 1 :(得分:0)

默认尝试使用 --------- beginning of crash E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.android.fotos, PID: 2613 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.SearchView.setSearchableInfo(android.app.SearchableInfo)' on a null object reference at com.example.android.fotos.MainActivity.onCreateOptionsMenu(MainActivity.java:41) at android.app.Activity.onCreatePanelMenu(Activity.java:2846) at android.support.v4.app.FragmentActivity.onCreatePanelMenu(FragmentActivity.java:358) at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88) at android.support.v7.app.AppCompatDelegateImplBase$AppCompatWindowCallbackBase.onCreatePanelMenu(AppCompatDelegateImplBase.java:270) at android.support.v7.view.WindowCallbackWrapper.onCreatePanelMenu(WindowCallbackWrapper.java:88) at android.support.v7.app.ToolbarActionBar.populateOptionsMenu(ToolbarActionBar.java:454) at android.support.v7.app.ToolbarActionBar$1.run(ToolbarActionBar.java:61) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) $ .ajax方法是async:true with async:true回调函数外的任何变量都不能更改。

async: false

答案 2 :(得分:0)

实际上,你有一个关闭问题(SO中有数百个帖子可以解决它)。您可以查看此ThreadPoolExecutor以获取完整说明(或在互联网上查找好文章)。

本质上,问题源于item是同步的,而ajax调用是异步的。这意味着你的for循环将在任何ajax调用之前完成。对于所有这些问题,Ajax回绕的回调itemd将为d(因此四个var list = ['a', 'b', 'c', 'd']; var newlist = []; // Closure problem for (element in list) { var item = list[element]; setTimeout(() => console.log(item), 0); } // No closure problem list.forEach((item) => setTimeout(() => console.log(item), 0));)。

快速解决方法是使用post代替。为了证明这一点,可以使用另一个异步函数而不是ajax调用来模拟您的问题:

var list = ['a', 'b', 'c', 'd'];
var newlist = [];

list.forEach(function(item) {
  $.ajax({
    url: "process.php",
    type: "get",
    data: {
      content: item
    }
  }).success(function(response) {
      newlist.push([item, response]);
    }
  }
});

因此,将此应用于您的代码,我认为您的问题可以解决如下:

{{1}}

希望它有所帮助。