我有一个node.js服务器,根据请求,将svg(需要相当长的时间来构建)发送到客户端,并阻止它向客户端发送不完整的svg,我使用了异步.each()用于构建svg的循环。
要调用write函数等,我使用一个回调函数,我将其传递给构建svg的函数,在async.each()完成后立即调用。
然而,async.each在被调用时表示我给svg构建函数的回调函数不存在。为什么会这样,我怎么称呼它呢?
function sendSVG(res){
var str = "somePredefinedStuff";
buildSVG(str,function(){
str += "someEndStuff";
res.write(str);
res.end();
});
}
function buildSVG(str,callback){
var array = [1,2,3];
async.each(array, function(a){
str += "moreStuff";
buildSVG(str);
str += "moreEndStuff";
},function(err){
console.log(typeof callback); //always returns undefined. Should actually return function once?
if(callback)
callback();
});
}
编辑:问题变成了代码的另一部分(从未调用过回调的情况)。该字符串仍然只以其原始形式发送,但应该有一个解决方法。
答案 0 :(得分:0)
您没有在嵌套的buildSVG
来电中传递回调。大概你想要的是:
async.each(array, function(a, cb) {
str += “moreStuff”;
buildSVG(str, function() {
str += “moreEndStuff”;
cb(); // call next async func
});
}, callback);
答案 1 :(得分:0)
我假设你正在使用nodejs异步库,如果是这种情况你需要调用next
函数来继续迭代。看看下面的代码
function sendSVG(res){
var data = {str: "somePredefinedStuff"};
buildSVG(data, function(){
data.str += "someEndStuff";
res.write(data.str);
res.end();
});
}
function buildSVG(data, callback){
var array = [1,2,3];
async.each(array, function(a, next){
data.str += "moreStuff";
buildSVG(data, function () {
data.str += "moreEndStuff";
setImmediate(next);
});
},function(err){
console.log(typeof callback); //always returns undefined. Should actually return function once?
if(callback)
callback();
});
}
请记住,由于递归,此代码会导致无限循环,因此您需要添加一个会破坏该递归的基本案例。或者改变它以便它根本不使用递归。