因此,我将顺序的ajax链接在一起,以按顺序加载URL数组。最初,我使用.then()
代替.always()
,并且无论哪种方式都可以正常工作-
只要所有网址都存在。但是,由于可能会丢失文件,因此我想对此进行补偿,然后,最后通知用户丢失了哪些文件,以便更轻松地进行纠正。
但是,问题是,在丢失的文件/
404上,代码会像应执行的那样执行,但随后退出循环,从而阻止了进一步的ajax调用。因此,我认为,我需要某种方式来处理fail()
并强制执行成功,无论如何,还是需要某种其他方式来覆盖404上的默认行为,以便它在循环中继续进行。
不幸的是,最接近Google的结果是相反的做法(成功失败会导致失败)。
var missing=[];
uLoadList.reduce(function(prev, cur, index) {
return prev.then(function(data) {
return $.ajax("/wiki/"+cur).always(function(data) {
var temp = $('#mw-content-text',data);
temp = $('pre',temp);
if(temp.length > 0)
{
//handle success
}else{
//handle failure
missing.push(cur);
}
});
});
}, $().promise()).done(function() {
if(missing.length > 0)
{
//notify of missing objects
}
//continue on.
});
为了减轻混淆,最后一点要注意:URL和脚本本身位于MediaWiki网站上-因此,即使返回404,也将始终存在页面内容,并将包含ID为“ mw-
content”的元素-文本”。
尝试
(function ($) {
$.when.all = whenAll;
function whenAll(arr) {
"use strict";
var deferred = new $.Deferred(),
args = !! arr
? $.isArray(arr)
? arr
: Array.prototype.slice.call(arguments)
.map(function (p) {
return p.hasOwnProperty("promise")
? p
: new $.Deferred()
.resolve(p, null, deferred.promise())
})
: [deferred.resolve(deferred.promise())],
promises = {
"success": [],
"error": []
}, doneCallback = function (res) {
promises[this.state() === "resolved"
|| res.textStatus === "success"
? "success"
: "error"].push(res);
return (promises.success.length
+ promises.error.length) === args.length
? deferred.resolve(promises)
: res
}, failCallback = function (res) {
// do `error` notification , processing stuff
// console.log(res.textStatus);
promises[this.state() === "rejected"
|| res.textStatus === "error"
? "error"
: "success"].push(res);
return (promises.success.length
+ promises.error.length) === args.length
? deferred.resolve(promises)
: res
};
$.map(args, function (promise, index) {
return $.when(promise).always(function (data, textStatus, jqxhr) {
return (textStatus === "success")
? doneCallback.call(jqxhr, {
data: data,
textStatus: textStatus
? textStatus
: jqxhr.state() === "resolved"
? "success"
: "error",
jqxhr: jqxhr
})
: failCallback.call(data, {
data: data,
textStatus: textStatus,
jqxhr: jqxhr
})
})
});
return deferred.promise()
};
}(jQuery));
// returns `Object {
// success: Array[/* success responses*/],
// error: Array[/* error responses */]
// }`
// e.g.,
var request = function (url, data) {
return $.post(url, {
json: JSON.stringify(data)
})
}, settings = [
["/echo/json/", "success1"], // `success`
["/echo/jsons/", "error1"], // `error`
["/echo/json/", "success2"], // `success`
["/echo/jsons/", "error2"], // `error`
["/echo/json/", "success3"] // `success`
];
$.when.all(
$.map(settings, function (p) {
return request.apply($, p)
})
)
.then(function (data) {
console.log(data);
// filter , process responses
$.each(data, function(key, value) {
if (key === "success") {
results.append(
"\r\n" + key + ":\r\n" + JSON.stringify(value, null, 4)
)
} else {
results.append(
"\r\n" + key + ":\r\n"
+ JSON.stringify(
value.map(function(v, k) {
v.data.responseText = $(v.data.responseText)
.filter("title, #summary, #explanation")
.text().replace(/\s+/g, " ");
return v
})
, null, 4)
)
}
})
}, function (e) {
console.log("error", e)
});
jsfiddle
http://jsfiddle.net/guest271314/620p8q8h/
我在试着理解为什么一些简单的环路会以这样的速度运行 第一种情况: 根据IACA,吞吐量是1个周期,瓶颈是端口1,05。我不明白为什么它是1 cylce。毕竟我们有两个循环承载的依赖关系: 而且这种Latency是循环进行的,所以它应该会减慢我们的迭代。 第二种情况: 我更不明白为什么吞吐量是1.65。
我有三块地 小时——分钟——和总数 如果小时或分钟发生变化,我想计算一个总数。如果总数发生变化,我想计算相应的分钟和小时数。 例子: 1h 30分钟=1.5总计 2.25总计=2h 15分钟 我正试图用手表来达到这个目的 但是,这会导致一个循环,因为on处理程序总是调用另一个处理程序。如何以更明智的方式实现这一点?
问题内容: 我遇到了一个有关“反向范围”的问题的答案],我打算对其投下反对票,因为它看起来很可笑,但经过检查就可以了(!): https://play.golang.org/p/4K2fDlSoCm 输出为: 任何想法为什么它会这样工作?我是不是可以保证不能完全按照相反的顺序执行?另外我也不认为这是编写程序的好方法,但很想知道为什么我们会得到这个结果。 问题答案: 是或堆栈- 保证以相反的顺序执行
问题内容: 因此,当我运行此代码时,我的JFrame变得无响应。我设法将其追溯到gameLoop()下的while循环。无论使用其中调用Thread.sleep()的delay(1000 / FRAMERATE),它都不允许键或鼠标侦听器执行其工作。 下面的完整代码,gameLoop()中存在问题 如果很重要,程序将从此处开始,然后转到Game类 可能无关紧要,但这是github存储库的插件htt
如何在不停止主GUI线程的情况下停止循环?(线程。睡眠(1000)未工作)
问题内容: 我正在使用带有node_redis的Node.js,并遍历一个对象并在Redis中查找数据,然后返回结果。 我有这样的设置: 问题在于,它会在完成对redis的调用之前循环通过。因此,在实际更新总值之前,将调用回调。由于延迟,它似乎也跳过了一些项目。 有没有更好的方法来解决这个问题? 谢谢! 编辑: 好的,所以我这样更新了它: 这似乎可行,它在适当的时间触发了回调,但是似乎只有最后一个