我有一个页面,使用被称为100次的jQuery .ajax(async:true),问题是,当它们全部被加载时,我需要系统在继续之前等待所有100个调用返回.我该怎么做?
提前致谢!:)
更新:
这些调用是在for()循环中进行的(其中有100个:))
我有多个同时运行的ajax查询,我希望它们等待最后一个返回,然后在所有ajax调用上运行成功处理程序.有关简化示例,请考虑:
$.ajax({//ajax call 1
url:page1.php,
success: function(data1){
//do something with data1
}
});
....
$.ajax({//ajax call 2
url:page2.php,
success: function(data2){
//do something with data2
}
});
//consider more than just two concurrent requests
Run Code Online (Sandbox Code Playgroud)
假设所有请求都是同时发送的.由于它们是异步的,它们将在不同的时间返回.假设一个请求需要100ms才能返回,另一个请求需要3000毫秒才能返回.我显然不知道哪一个会先返回.它们都以某种方式更新DOM,我希望在一次更新时一次性向观众显示这些更改.我该怎么做呢?
我能想到的最好的方法是将data1和data2保存为全局变量.然后有一个计数器变量,每次返回成功时都会计数.然后,在counter == TOTAL_NUM_REQUESTS调用updateAll()之类的函数时,然后运行所有全局变量并将它们放在需要的位置.但这似乎很乱,容易出错.加上那将是很多全局变量.
我理想的是让成功处理程序在返回时休眠,然后在我将所有这些数据作为返回值进行计数的情况下,向所有这些程序发送唤醒消息并且它们可以继续执行.这似乎是最干净的,但我不知道在javascriptland中有这样的任何功能.
有没有人对此有任何光鲜的想法?
答案更新
感谢Lee,我能够得到一个解决方案.我的解决方案与他的下方类似.我构建了一个async分配给$ .ajax调用的变量列表.最初那些ajax调用的成功处理程序仍然被调用,所以我删除了它们并将它们放在另一个函数中,这个函数随后被when我写的这个块调用.我传递results给这样的函数:
var results = [];
results.push(async1);
results.push(async2);
... for all the results ...
$.when.apply(this, results).done(function() {
for(var i=0;i<arguments.length;i++){
dataobject=arguments[i][0]
if(dataobject.variousattribute)
mySuccessHandlerFirstGuy(dataobject)
else if(dataobject.anotherattribute)
mySuccessHandlerSecondGuy(dataobject)
//etc ....
}
};
Run Code Online (Sandbox Code Playgroud)
参数对象花了一些时间来弄清楚它是什么.这是一个2d数组(列表列表).第一个索引表示与给定的ajax请求相对应的返回对象.它似乎是有序的,但最好让你的服务器返回你可以查找的东西并相应地写一个if/else块.然后,在该给定元素中,该列表中似乎有3个元素.第一个是从服务器返回的值,即您想要的值.第二个总是一个字符串success,你可以用它来检查呼叫是否有效.并且该列表中的第三个元素似乎是最初的请求(虽然我不确定).这对我没用. …
我的文档中有一些ajax调用.ready()
喜欢 :
for (j=1; j <= 7; j++){
(function(index) {
$.getJSON('my.php', {id:index},
function(data) {
$.each(data, function(index2, array){
........
});
});
})(j)
}
//DO NOT CONTINUE UNTIL FINISH AJAX CALLS
........
MORE JQUERY CODE
Run Code Online (Sandbox Code Playgroud)
我怎么能强迫它等待而不是继续,直到我们从ajax请求得到所有回调?
建立:
我有一个Datatable,每行都是可点击的.单击一行时,将进行ajax调用,返回一些数据.有时,ajax调用需要一些时间,具体取决于返回的数据量.一切正常.
问题:
快速单击行,一个接一个地出现问题.简而言之,在前一个ajax调用返回之前,如果单击该行(即进行了新的ajax调用),则会出现错误.
Uncaught TypeError: Property 'callback' of object [object Window] is not a function
Run Code Online (Sandbox Code Playgroud)
(ajax调用返回JSONP数据)
它看起来像ajax调用混杂(?),但我不确定这一点.任何人都可以告诉我为什么会这样?
如果需要更多信息来澄清问题,请告诉我.
谢谢
编辑1:
这是一些ajax代码:
$.ajax({
type: "GET",
url: 'http://' + myserver + ':8080/someurl/' + my_param,
contentType: "application/json",
dataType: "jsonp",
jsonpCallback: 'callback',
success: function(data) {
// Inside here, I am doing some Datatables stuff.
var myTable = $('#my_table').dataTable( {
"bJQueryUI" : true,
"bSort" : false,
"bFilter" : false,
"bPaginate": true,
"bProcessing": true,
"bScrollCollapse": true,
"bInfo": false,
"bDestroy": true,
"aaData": samples,
"sEmptyTable": "No sample …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用HTML中的JQuery完成以下操作序列.
我构建了下面发布的Java脚本代码.它完美地工作,除非其中一个请求由于404错误而失败:然后,$.when不运行,因为它在请求失败时立即中止.你能以某种方式覆盖ajax请求,所以它们不会失败,而是返回一个空源?
我已经阅读了这篇文章和这篇文章,但它没有提供一个解决方案,可以在所有查询完成后运行代码.
function fetchData() {
queries = [];
//urls is initialized somewhere else containing all urls
for(var url in urls) {
queries.push($.getJSON(url));
}
$.when.apply(this, queries).done(function() {
console.log("Finished all queries, got "+arguments.length+" results");
//Now arguments is a array containing the results of all requests
}
//function returns instantly, no problem!
}
Run Code Online (Sandbox Code Playgroud) 我正在运行一个更新表上记录的循环,但我需要等待所有记录更新才能继续.
我怎样才能让jquery等到loopselectedrows函数中的所有调用完成?我读过.deferred和.when,但我不知道如何实现.他们似乎都无法处理一系列的调用,如果我在哪里切换到使用ajax帖子的数组.任何帮助将不胜感激.
这是启动它的按钮:
click: function () {
// validate all rows
var $selectedRows = $('#Table1').jtable('selectedRows');
LoopSelectedRows($selectedRows, 'Validate');
Run Code Online (Sandbox Code Playgroud)
///等待所有ajax调用完成//然后继续检查
// check for any row with an error
var $ValidatedRows = $('#Table1').jtable('selectedRows');
var boolCheck = checkValidatedRows($ValidatedRows);
// if all records are succesfull then add them
// else alert user
if (boolCheck == true) {
LoopSelectedRows($selectedRows, 'Add');
}
else {
alert("Please correct invalid records and try again");
}
}
Run Code Online (Sandbox Code Playgroud)
这样做的第一件事是从表中获取所有记录并将它们传递给循环函数.
这是循环函数 -
function LoopSelectedRows(SelectedRecords, actionType) {
if (SelectedRecords.length > 0) {
//Show selected …Run Code Online (Sandbox Code Playgroud) 我正打算召唤一个返回Json的Api.我试图将这些返回的数据放入一个可淘汰的可观察数组中.我的视图模型如下所示:
var adminData = $.getJSON("/api/administrators");
//console.log(adminData);
var viewModel = {
administrators: ko.observableArray(adminData)
};
ko.applyBindings(viewModel);
Run Code Online (Sandbox Code Playgroud)
请求通过并返回一个对象,其中包含adminData中的预期数据,但是当我尝试将其添加到ko.observableArray时,我在控制台中得到了这个:初始化可观察数组时传递的参数必须是数组.我无法弄清楚如何将数据转换为数组以进行淘汰赛.
这问题几乎相同:等到所有jQuery Ajax请求都完成了?
但我的问题是克服:
我正在做很多ajax请求,并将它们保存在一个数组中:
var events = [];
for(var i = 0; i < 10; ++i) {
events.push($.ajax({...}));
}
$.when(events).done(function() {
// do something when all requests are done.
});
Run Code Online (Sandbox Code Playgroud)
正如相关问题所述,$ .when方法按顺序获取了一些jqXHR对象,但在这里我想要一个列表.
我在http://api.jquery.com/jQuery.when/#jQuery-when-deferreds中阅读了这些文档,但该方法似乎不支持这种情况(将一个列表传递jqXHR给$.when函数)
怎么会这样?Plz的帮助.
我有一个网页,我有3个单独的ajax调用
所有3使用相同的结构:$ .ajax({//这是处理数据和发送邮件url的urp文件:url,
//POST method is used
type: "POST",
//pass the data
data: data,
//Do not cache the page
cache: false,
//success
success: function (json) {
Run Code Online (Sandbox Code Playgroud)
我想触发另一个函数,但只有3个单独的ajax调用成功.
我该怎么做呢?
更新:使用$ .when()时我现在遇到问题
我的代码现在看起来像这样:
function mainFunction() {
$.when(someAjaxCall()).done(function(ajaxResult){
// after all the pages, covers, and sneaks are uploaded
// we will now change the status
//start the ajax
console.log(ajaxResult);
}
function someAjaxCall() {
// do something...
if (someGlobalScopedVariable == true) {
return $.ajax({
//this is the php file that processes the data and …Run Code Online (Sandbox Code Playgroud) 我正在构建一个带有很多ajax调用的Web应用程序,100多个,我用来在我的Web应用程序中注入所有内容.
我希望找到一种隐藏页面并显示ajax微调器的方法,直到所有ajax调用完成...和/或整个应用程序已加载,然后显示该站点.
否则,用户可以导航A.可能无法完全正确呈现的页面,或者当网站在完全加载时刷新到Home时,将导航到中间导航.
我遇到了一个解决方案的胆量,但不知道如何实现.或者将两者放在一起...大学项目到目前为止还没有专业人士,但这看起来很有希望
$(document).ajaxStop(function () {
// $.active == 0
});
Run Code Online (Sandbox Code Playgroud)
$(document).ajaxStart(function() {
$.mobile.loading('show');
});
$(document).ajaxStop(function() {
$.mobile.loading('hide');
});
Run Code Online (Sandbox Code Playgroud)
我怎么能让这个工作?我的ajax调用是在许多.js文件中引用的(app的不同部分)
非常感谢任何帮助!
编辑:使用示例ajax调用
$.ajax(
{
url: "http://myurl",
type: 'get',
dataType: 'jsonp',
success: function(data)
{
if (data.result == 'success')
{
var previousPageID = "";
var currentPageID = "";
$.each(data.data, function(key, data) //scans through each Lv1 Category, creates a button and page and links thems.
{
var divLabel = data.label;
var pageID = currentPageID + data.label.replace(/\s/g, "");
$('#contentPage').append(generateButtons(pageID, divLabel)); //generates …Run Code Online (Sandbox Code Playgroud) ajax ×9
jquery ×8
javascript ×6
json ×2
callback ×1
java ×1
jsonp ×1
knockout.js ×1
spinner ×1
wait ×1