1

我将 javascript 片段作为字符串传递,该字符串被调用为数据数组(csv 文件)。我只想在完成第一行后评估下一行:

CoffeeScript(编译成 javascript 并在浏览器中运行):

for row in rest
  map = makeMap header,row
  json = JSON.stringify map
  eval "((#{fn})(#{json}))"

Javascript 片段(存储为字符串):

function(map) {
  console.log(map.customer_id);
  $.ajax("http://localhost:3000/data/" + map.customer_id,
         function(data) { console.log(data);});
}

done()Jasmine BDD 或其他 javascript 测试框架中的一个实现是如何实现的?

4

2 回答 2

1

根据该$.ajax函数来自哪个框架,您可能能够将参数传递给它以使 AJAX 同步。

但是,并非所有异步函数都可以选择进入异步模式。在这种情况下,唯一的方法是让他们调用回调(硬编码或作为参数)。不幸的是,您需要将该 for 循环重写为递归函数(或使用为您执行此操作的异步库)。

var i = 0;
function processItems(i){
   if(i >= rest.length){
      return whatToDoNext();
   }else{
      runMyAsyncCode(function(){
         proccessItems(i+1);
      })
   }
}
于 2013-03-06T18:43:09.550 回答
0

通常,您无法轻松地使 javascript 同步运行。但是,您可以使其看起来同步运行,例如,使用 Promise(代表函数返回的最终值的对象)。您可以在jquery docs中阅读承诺(在 jquery 中称为延迟对象)。

这就是使用 jquery 延迟对象的 ajax 处理程序的样子(注意done函数的使用)

$.ajax("http://localhost:3000/data/" + map.customer_id).done(function(data) {
    console.log(data);});
});
于 2013-03-06T19:28:19.557 回答