【发布时间】:2014-05-31 15:52:58
【问题描述】:
我已经阅读了几十个与回调、承诺和其他控制流程的方法相关的答案,但我仍然无法完全理解这项任务,显然是因为我缺乏能力。
我有一个嵌套问题:
- 在
test_1()(和其他函数)中,我想确保根据元素在对象中的顺序将行添加到表中; - 我想仅在 test_1 完全完成后执行 test_2 或 test_3 (或两者之后)。实际上正确的序列只有在运行时才能知道(会有一个带有可能序列的开关,如 1,2,3 或 1,3,2 或 1,2,1,3 或 1,3,3,2,等等...)
代码:
$(function () {
// create table
tbl = document.createElement('table');
tbl.className = "mainTbl";
$("body").append(tbl);
});
function test_1() {
$.each(obj, function () {
var img = new Image();
img.onload = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "loaded";
};
img.onerror = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "not loaded";
};
img.src = this.url;
});
}
function test_2() {
$.each(obj, function () {
var img = new Image();
img.onload = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "loaded";
};
img.onerror = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "not loaded";
};
img.src = this.url;
});
}
function test_3() {
$.each(obj, function () {
var img = new Image();
img.onload = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "loaded";
};
img.onerror = function () {
// add row of data to table
var row = tbl.insertRow(-1);
var c1 = row.insertCell(0);
c1.innerHTML = "not loaded";
};
img.src = this.url;
});
}
我知道按顺序调用这些函数是行不通的,因为它们不会互相等待……我认为 promises 是他们的路要走,但我找不到正确的组合,文档也是如此对我的技能来说很复杂。
构建代码以使其按正确顺序执行的最佳方式是什么?
【问题讨论】:
-
这段代码在我看来都是同步的,你能指出为什么它会异步运行
-
@RossBille - 在图像的异步加载处理程序中插入行。
-
如果您立即插入行然后让图像加载,则不会出现异步问题。导致异步问题的原因是您仅在图像加载时才插入行。
-
可以存储所有中间结果,并且只按顺序添加行,而不管图像加载的顺序是什么,同时保留 iamges 的并行加载,并且可以通过 Promise 完成所有这些操作,但是对于一些可以重新考虑为更简单的解决方案的东西似乎需要做很多工作。但是,我们必须更多地了解您所做工作的实际要求,才能提升到更高的水平,为您考虑更好的解决方案。
-
另外,为什么
test_1()、test_2()和test_3()的代码相同?
标签: javascript jquery promise