我知道很多关于这个主题的主题已经存在(例如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'四次。
我做错了什么?
答案 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回绕的回调item
和d
将为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}}
希望它有所帮助。