迭代中的异步函数-javascript
我试图不在d3中异步的函数上复制代码和循环。这里有一些代码 由于d3.text是异步的,因此我无法以正确的方式使用索引迭代中的异步函数-javascript,javascript,asynchronous,callback,d3.js,Javascript,Asynchronous,Callback,D3.js,我试图不在d3中异步的函数上复制代码和循环。这里有一些代码 由于d3.text是异步的,因此我无法以正确的方式使用索引u将对象附加到DOM。我该怎么做?一旦d3.text完成,我需要循环转到下一个迭代 for(var u in urls) { console.log(u); var url = "interest_points/" + urls[u] + ".csv"; var data_gpBy_month = {}; var sortable_month = [] d3
u
将对象附加到DOM。我该怎么做?一旦d3.text完成,我需要循环转到下一个迭代
for(var u in urls) {
console.log(u);
var url = "interest_points/" + urls[u] + ".csv";
var data_gpBy_month = {};
var sortable_month = []
d3.text(url, function(text) {
// some code...
var data = d3.csv.parseRows(text).map(function(row) {
//some code...
});
//some code
});
}
像这样的东西(小提琴:)
如果我理解正确:
function doSomething(array) {
var u = array.shift();
console.log(u);
var url = "interest_points/" + urls[u] + ".csv";
var data_gpBy_month = {};
var sortable_month = []
d3.text(url, function(text) {
// some code...
var data = d3.csv.parseRows(text).map(function(row) {
//some code...
});
//some code
if (array.length > 0)
doSomething(array);
});
doSomething(Object.keys(urls));
循环应该是这样的:
for(var u in urls) { loadParseAndRender(u); }
然后,所有现有逻辑都进入loadparseandender
,但此时u
将永远不会被覆盖。也就是说,用花言巧语来说,它在闭包中被捕获
function loadParseAndRender(u) {
// the rest of your code
}
David W的建议与abive的建议相同,但在不为其创建命名函数的情况下,您可以这样做:
for(var _u in urls) {
(function(u) { // this is an anonymous function
// the rest of you code
})(_u) // this function gets called as soon as it's declared
}
为什么不在匿名函数中捕获u的值,然后将捕获的值作为参数传递给内部函数?也就是说,捕获外部闭包处的索引var并将其干净地传递给内部闭包?是的,它听起来像@DavidW建议的是正确的方法(与下面的任何答案不同),假设问题是在执行回调时,
u
从最后一次循环迭代中设置为its值。我的Javascript技能有限,因此如果您能告诉我如何做到这一点,我将不胜感激@meetamit是的,这就是发生的事情hi@Saher我已经看到了一些答案,基本上说明了我关于获取价值的建议,但是你提到的“你想在d3.text完成后进入下一次迭代”这让我有些担心。如果d3.text是异步的,那么代码不会在调用时阻塞,但听起来您希望它在调用时阻塞。您必须保证.Text调用的执行顺序吗?是的,第一个答案解决了它。您可能需要修复索引。这将从1开始不,它起作用,检查小提琴。currentUrlIndex++首先返回,然后递增。不确定,因为我必须将其更改为工作状态,它是从第一个索引开始的。。。谢谢你的回答!嘿,meetamit,这很好,但是op提到一旦上一个迭代完成,他需要循环转到下一个迭代。如果我理解正确的话,像这样使用函数调用并不能保证回调的执行顺序。这将取决于ajax返回的速度。@pax162是的。。。订单不能保证。
for(var _u in urls) {
(function(u) { // this is an anonymous function
// the rest of you code
})(_u) // this function gets called as soon as it's declared
}