使eval同步运行异步代码

时间:2013-03-06 18:07:22

标签: javascript eval

我将一个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);});
}

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

2 个答案:

答案 0 :(得分:1)

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

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

var i = 0;
function processItems(i){
   if(i >= rest.length){
      return whatToDoNext();
   }else{
      runMyAsyncCode(function(){
         proccessItems(i+1);
      })
   }
}

答案 1 :(得分:0)

通常,你不能让javascript同步运行而不会有太多麻烦。但是,您可以使显示同步运行,例如,使用promises - 表示函数返回的最终值的对象。您可以在jquery docs中阅读promises(在jquery中称为延迟对象)。

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

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