JavaScript,Node.js:给定函数在async.each()回调中未定义

时间:2018-01-27 20:10:27

标签: javascript node.js callback async.js

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

编辑:问题变成了代码的另一部分(从未调用过回调的情况)。该字符串仍然只以其原始形式发送,但应该有一个解决方法。

2 个答案:

答案 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();

  });
}

请记住,由于递归,此代码会导致无限循环,因此您需要添加一个会破坏该递归的基本案例。或者改变它以便它根本不使用递归。