我使用jQuery。 而且我不希望我的应用程序并行AJAX调用,每次调用必须在开始前等待前面。 如何实现呢? 有什么帮助?
UPDATE如果没有了XMLHttpRequest或jQuery.post我想知道的任何同步版本。 但是,连续的!=同步,和我想的异步和连续的解决方案。
我使用jQuery。 而且我不希望我的应用程序并行AJAX调用,每次调用必须在开始前等待前面。 如何实现呢? 有什么帮助?
UPDATE如果没有了XMLHttpRequest或jQuery.post我想知道的任何同步版本。 但是,连续的!=同步,和我想的异步和连续的解决方案。
有一个更好的方法来做到这一点比使用同步Ajax调用。 jQuery的AJAX返回一个延迟,所以你可以只使用管道链接,以确保每一个AJAX调用下一运行之前完成。 下面是与深入的例子更可以工作的例子对的jsfiddle玩 。
// How to force async functions to execute sequentially
// by using deferred pipe chaining.
// The master deferred.
var dfd = $.Deferred(), // Master deferred
dfdNext = dfd; // Next deferred in the chain
x = 0, // Loop index
values = [],
// Simulates $.ajax, but with predictable behaviour.
// You only need to understand that higher 'value' param
// will finish earlier.
simulateAjax = function (value) {
var dfdAjax = $.Deferred();
setTimeout(
function () {
dfdAjax.resolve(value);
},
1000 - (value * 100)
);
return dfdAjax.promise();
},
// This would be a user function that makes an ajax request.
// In normal code you'd be using $.ajax instead of simulateAjax.
requestAjax = function (value) {
return simulateAjax(value);
};
// Start the pipe chain. You should be able to do
// this anywhere in the program, even
// at the end,and it should still give the same results.
dfd.resolve();
// Deferred pipe chaining.
// What you want to note here is that an new
// ajax call will not start until the previous
// ajax call is completely finished.
for (x = 1; x <= 4; x++) {
values.push(x);
dfdNext = dfdNext.pipe(function () {
var value = values.shift();
return requestAjax(value).
done(function(response) {
// Process the response here.
});
});
}
有人曾评论说,他们不知道什么代码的功能。 为了了解它,你首先需要了解JavaScript的承诺。 我敢肯定的承诺是即将成为本地JavaScript语言功能,因此,应该给你一个很好的激励学习。
你有我能想到的两种选择。 一种是通过回调来把它们连。 另一种是打的电话同步,而不是异步。
你有什么希望他们连续的理由吗? 这将慢下来。
要拨打电话同步,您将设置在Ajax调用假async选项。 请阅读文档http://docs.jquery.com/Ajax/jQuery.ajax#options (点击选项选项卡,看到他们)。
你可以给叙述javascript中的尝试http://www.neilmix.com/narrativejs/doc/
我从来没有使用,虽然它自己。 如果我想做到这一点,我会建立某种抽象为链的异步操作。 正如其他人所说,而它的等待响应正在处理来自Ajax对象块事件的synchonous版本。 这将导致浏览器看起来像它的冷冻,直到它临危响应。
异步选项设置为false,例如,
$.ajax({ async: false /*, your_other_ajax_options_here */ });
参考: 阿贾克斯/ jQuery.ajax
你可以做到这一点的最好办法是通过链接回调为Nosredna说。 因为他们锁定您的整个应用程序,我不会建议使用XMLHttpRequest的同步。
有没有太多的帮手这个据我知道,但你可以做一些类似的回调FIFO。
看看这个: http://docs.jquery.com/Ajax/jQuery.ajax (点击“选项”选项卡上)。
但要记住,直到接收到响应同步调用将冻结的页面,所以它不能在生产现场使用,因为用户会很生气,如果因为任何原因,他们必须等待30秒,他们的浏览器冻结。
编辑:好吧,你更新它更清晰,你想要达到的目标;)
所以,你的代码可能是这样的:
$.getJSON("http://example.com/jsoncall", function(data) {
process(data);
$.getJSON("http://example.com/jsoncall2", function (data) {
processAgain(data);
$.getJSON("http://example.com/anotherjsoncall", function(data) {
processAgainAndAgain(data);
});
});
});
这样,第二个呼叫将只在第一个呼叫响应已接收和处理发出,而当第二个呼叫的响应已收到并处理的第三通话将仅发行。 此代码是的getJSON,但它可以适用于$阿贾克斯。
而现在看来,你有一个解决方案:
http://api.jquery.com/category/deferred-object/
要么
http://www.slideshare.net/furf/making-ajax-sexy-jsconf-2010?from=ss_embed
同步调用并不一定要慢,如果你有一个应用程序,其中AJAX调用open,员额,然后关闭插座,插座上的多个呼叫没有任何意义一些插座只能处理一个连接,在这种情况下,排队数据,因此它仅在发送之前的AJAX调用完成意味着更高的数据吞吐量。
(async () => {
for(f of ['1.json','2.json','3.json']){
var json = await $.getJSON(f);
console.log(json)
};
})()
更多的MDN
如何使用Node.js的事件?
var EventEmitter = require('events').EventEmitter;
var eventEmitter = new EventEmitter();
var $ = require('jquery');
var doSomething = function (responseData) {
var nextRequestData = {};
// do something with responseData
return nextRequestData;
};
// ajax requests
var request1 = $.ajax;
var request2 = $.ajax;
var requests = [request1, request2];
eventEmitter.on('next', function (i, requestData) {
requests[i](requestData).then(
function (responseData) {
console.log(i, 'request completed');
if (i+1 < requests.length) {
var nextRequestData = doSomething(responseData);
eventEmitter.emit('next', i+1, nextRequestData);
}
else {
console.log('completed all requests');
}
},
function () {
console.log(i, 'request failed');
}
);
});
var data = {
//data to send with request 1
};
eventEmitter.emit('next', 0, data);
顺序!=同步,和我想的异步和时序解决方案
同步执行通常是指“使用相同的时钟”,而顺序执行的意思是“在顺序或次序以下”。
为了您的具体使用情况下,我认为这两个条件必须满足,如异步执行意味着不连续的结果的可能性。