我有一个for
循环,在一次迭代中,我需要发出四个AJAX请求,然后等待最后一个请求的结果。
现在,我只知道如何将数据从先前的promise传递给另一个promise(就像这个很酷的答案),但我需要将上次AJAX调用的值返回到外部数组(并等待上次AJAX调用完成),然后继续循环之外的其他函数。
attaches.forEach(function(attach)) {
if(attach.val == "val1"){
attachments.push(attach.val1);
}
if(attach.val == "val2"){
attachments.push(attach.val2);
}
if(attach.val == val3){
function func1(){
var params = [param1,param2];
return $.post(api, params.join('&'))
}
function func2(){
console.log('1111');
return new Promise(function(resolve, reject)) {
var xhr = new XMLHttpRequest();
xhr.onload = function () {
resolve(xhr.response);
}
xhr.open('GET', img_src);
xhr.responseType = 'blob';
xhr.send();
});
}
function uploadPhoto(upload_url, bulbSend){
console.log('<Del><F7> function uploadPhoto');
return $.ajax({
url: upload_url,
type: 'POST',
data: bulbSend,
dataType: 'json',
processData: false,
contentType: false,
});
}
function saveResult(params){
return $.post(api, params.join('&'))
}
func1().then(fun1hand()).then(console.log('a32w436bya3b7naua'));
function fun1hand(){
return function(dat4a) {
return func2().then(func2hand(dat4a));
};
}
function func2hand(dat4a){
console.log('2222');
return function(datums){
console.log('3333');
var upload_url = dat4a.upload_url;
console.log('UPLOAD__URL BEFORE PROMISE '+upload_url);
var bulbSend = new FormData();
bulbSend.append('file1', datums, 'file.jpg');
return uploadPhoto(upload_url,bulbSend).then(func3hand());
}
}
function func3hand(){
return function(data2){
var params = [data2.param1, data2.param2, data2.param3];
return saveResult(params).then(pushToAttachmentsHandler());
}
}
function pushToAttachmentsHandler(){
return function(data3){
console.log('PUSUSUSUSSUSUSUUSUS PUSHHHHHHH PUSH DA BAUTTON');
console.log(attachments);
return pushDat(data3).then(console.log(attachments));
}
}
function pushDat(data3){
console.log('1111');
return new Promise(function(resolve, reject) {
attachments.push(data3.param3+"_"+data3.param1));
console.log('11111111111');
});
}
}
});
不在循环中的函数在console.log('3333')
insidepromise之前启动其console.log
s...但他们需要等待循环内的AJAX调用完成和循环完成。
现在,如果AJAX被拒绝,我需要在超时后重复它(每秒服务器请求限制)--我如何在我的代码中为promise内部的本机XMLHttpRequest()
和返回的jQuery AJAX调用设置它呢?
回调或promise能够处理这种异步控制流...
假设您的原始非工作代码是...
for(var i=0; i < 10; i++){
$.get('http://example.com/rest/users/'+i);
$.get('http://example.com/rest/posts/'+i);
$.get('http://example.com/rest/comments/'+i);
$.get('http://example.com/rest/events/'+i);
}
var i = 1;
getSet(repeater);
// define a repeater function to be used as recursive callback
function repeater (){
// increment counter
i++;
// if we still have items to process, get another set
if(i < 10){
getSet(repeater);
}
}
function getSet(cb){
// define queue
var counter = 0;
// make four api calls, defining success callbacks, which call the
// originally passed callback if the counter reaches 0. Increment counter before each request. This means the callback fires only for the last result
counter++;
$.get('http://example.com/rest/users/'+i, handleSuccess);
counter++;
$.get('http://example.com/rest/posts/'+i, handleSuccess);
counter++;
$.get('http://example.com/rest/comments/'+i, handleSuccess);
counter++;
$.get('http://example.com/rest/events/'+i, handleSuccess);
function handleSuccess(data){
// do something with data
--counter || cb();
}
}
这个模式的工作原理是这样的...
getset
是第一次调用的,它带有一个repeater
函数,在完成所有异步请求后,该函数将被调用。getset
函数在进行异步调用时递增堆栈,在异步回调时递减堆栈,在堆栈恢复为零且队列中不再有异步作业时调用repeater
。然后,repeater
回调重复整个过程,调用getset
并将自身作为回调传递,直到满足条件为止。
问题内容: 我使用jQuery发送AJAX请求,从服务器检索数据。 然后将该数据附加到元素。这应该发生5次,但总是会随机发生3、4或5次。基本上,循环有时会跳过AJAX请求,但大多数情况下都会捕获该请求。如何确保每次完成五次请求?以及跳过AJAX请求的这种随机行为的背后原因是什么?(旁注。我已经检查了请求错误,但从未警告到请求失败) 这是我的JS: ps这发生在按下按钮时。 问题答案: 不要同步进
我正在构建一个小型聊天应用程序,以了解一些有关jquery和Ajax的知识。它工作得很好,但目前chatbox正在以以下代码在一个间隔内抓取log.HTML的HTML: 现在,如果用户试图复制一行,它将退出,因为html每隔几秒钟就会刷新一次。因此,我希望构建一个检查来记住最后一条已知消息,并将其与日志中的最后一条消息进行比较。如果它们不匹配(出现了一条新消息),只有这样浏览器才会刷新聊天框中的h
问题内容: 我必须在循环上进行一系列Ajax请求。其中约有100个。每个请求都返回一个JSONP变量。我从JSON提取数据,并将该值附加到div中。问题是我希望div以函数调用的顺序附加数据。即顺序。现在,我每次刷新页面时都会得到不同的顺序,具体取决于请求完成的顺序。这是我的代码。 当我在div中显示索引值时,每次我得到随机订单。有时是2 4 3 1 7,有时是1 5 2 7 4。我什至尝试asy
问题内容: 我有一个函数,用关键字声明一个变量。然后,它将启动AJAX请求以设置变量的值,然后从函数中返回此变量。 但是,我的实现失败了,我也不知道为什么。 这是代码的简化版本; 问题答案: AJAX请求是异步的。您的sendRuest函数正在执行,正在发出AJAX请求,但它是异步发生的;因此,sendRuest的其余部分在AJAX请求(和onreadystatechange处理程序)执行之前就已
问题内容: 我想做的事情似乎很简单:通过 HTML 页面并从中提取一个值。 问题是 jQuery 拒绝解析返回的HTML。 同时,我正在玩的小提琴没有用,因此我无法提供其他可行的示例。 更新: 我的新提琴工作正常,但是似乎问题在于,在我的实际项目中,我试图解析大量复杂的HTML。这是一个已知问题吗? 问题答案: 您的代码工作正常。您只是没有正确使用jsFiddle的API。检查文档中的(http:
问题内容: 在浏览Facebook并使用Firebug网络调试器时,我注意到Facebook的AJAX响应均以空的for循环开头。 例: 有人知道为什么这样做吗?我认为这是为了防止某种XSS攻击,但我并不完全理解。谢谢! 问题答案: 像谷歌的 这样做是为了防止在进一步使用数据时将其包括在内