【问题标题】:JavaScript, Node.js: given function undefined in async.each() callbackJavaScript,Node.js:给定函数在 async.each() 回调中未定义
【发布时间】:2023-03-21 00:20:02
【问题描述】:

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

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

【问题讨论】:

  • 我不明白你的代码。为什么buildSvg 会递归调用自己?

标签: javascript node.js callback async.js


【解决方案1】:

您没有在嵌套的 buildSVG 调用中传递回调。想必你想要的是:

async.each(array, function(a, cb) {
  str += “moreStuff”;
  buildSVG(str, function() {
    str += “moreEndStuff”;
    cb(); // call next async func
  });
}, callback);

【讨论】:

    【解决方案2】:

    我假设您使用的是 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();
    
      });
    }
    

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

    【讨论】:

      猜你喜欢
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2016-01-26
      • 2012-02-23
      • 2019-01-07
      相关资源
      最近更新 更多