Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代中的异步函数-javascript_Javascript_Asynchronous_Callback_D3.js - Fatal编程技术网

迭代中的异步函数-javascript

迭代中的异步函数-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

我试图不在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.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 
}