我将一个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()
?
答案 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);});
});