Javascript TypeError:回调不是nodeJS中带有asyncJS的函数

Javascript TypeError:回调不是nodeJS中带有asyncJS的函数,javascript,node.js,async.js,Javascript,Node.js,Async.js,我想写一个函数,它用多个同步调用来调用自己。这里的代码只是流程的一个简单示例。问题是nodeJS给了我一个TypeError:asyncCb不是一个函数 我研究了这个错误,似乎参数返回的不是函数,但我在代码中找不到错误。我是一个新的nodeJS开发人员,所以我可能会错过一些明显的东西 谢谢你的帮助 var async=require'async'; //number是一个整数,deepdive定义是否第一次调用该函数,cb包含常规回调,asynCb包含asyncJS回调 var asyncTe

我想写一个函数,它用多个同步调用来调用自己。这里的代码只是流程的一个简单示例。问题是nodeJS给了我一个TypeError:asyncCb不是一个函数

我研究了这个错误,似乎参数返回的不是函数,但我在代码中找不到错误。我是一个新的nodeJS开发人员,所以我可能会错过一些明显的东西

谢谢你的帮助

var async=require'async'; //number是一个整数,deepdive定义是否第一次调用该函数,cb包含常规回调,asynCb包含asyncJS回调 var asyncTester=函数编号、deepdive、cb、asyncCb{ //检查函数是否应嵌套自身-仅在第一次调用时嵌套 如果深度潜水==真{ var funcArray=[]; //使用此函数的多个调用加载async 对于var时间=2;时间<4;时间++{ funcArray.pushfunctioncallback{ asyncTestertimes,false,null,回调; }; } //使用函数数组和最终回调处理调用async async.seriesfuncArray, 函数、结果{ //返回包含异步系列结果的原始回调 返回cberr,结果; }; } //在嵌套调用中返回异步回调 返回asyncCbnull,number; }; asyncTester1,true,functionerr,data{ //预期结果数组为1、2、3 控制台日志数据; },空 asyncTester函数需要4个参数:

var asyncTester = function(number, deepdive, cb, asyncCb) {
但是,你只能用三个词来称呼它:

asyncTester(1, true, function(err, data) {

所以第四个参数asyncCb是未定义的。

感谢您的精简复制。抛出错误是因为您正在将空值变量作为函数调用

当您自己调用asyncTester时,您为asyncCb提供null,而您给async.series的函数提供了一个实际的回调函数

我已经更新了您的代码,并添加了一些console.log语句来说明这一点

var async = require('async');

// number is an integer, deepdive defines if the function is called the 
// first time or not, cb contains the regular callback, asynCb contains
// the asyncJS callback
var asyncTester = function(number, deepdive, cb, asyncCb) {

    console.log(asyncCb);  // <=== new

    //check if function should nest itself -- only on the first call
    if (deepdive == true) {
        var funcArray = [];

        //load async with multiple calls of this function
        for (var times = 0; times < 4; times++) {
            funcArray.push(function(callback) {
                asyncTester(times, false, null, callback);
            });
        }

        //call async with array of functions and final callback handling
        async.series(funcArray,
            function(err, results) {
                //return the original callback with the results from
                // the async series
                console.log('.series callback');  // <=== new
                return cb(err, results);
            });
    }

    //return the async callback when in a nested call
    return asyncCb(null, number);
};

asyncTester(
    1, true,
    function(err, data) { console.log(data); },
    function()          { console.log('all done!'); }  // <=== new
);
我怀疑你对这个问题的调查受到了阻碍,因为在这个例子中,你不确定这是否是故意的,你实际上没有做任何异步的事情

我们可以通过用以下代码替换推送到async.series的数组中的匿名函数体来强制异步执行内部代码:

然后控制台输出如下所示,更明显的是,您的代码中存在一个bug,该bug会立即运行,而不是在事件循环的未来迭代中运行:

null
/Users/pmidge/workspace/personal/jstest/main.js:2079
        return asyncCb(null, number);
               ^

TypeError: asyncCb is not a function
    at asyncTester (/Users/pmidge/workspace/personal/jstest/main.js:2079:16)
    at test63 (/Users/pmidge/workspace/personal/jstest/main.js:2082:5)
    at Object.<anonymous> (/Users/pmidge/workspace/personal/jstest/main.js:2090:1)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:139:18)
    at node.js:999:3

您可能会认为您正在传回带有预加载参数的函数。任何时候你做异步测试。。。您正在调用该函数。默认情况下,函数返回未定义的值。因此,在每一个调用中,都返回未定义的函数,而不是一个函数。我如何避免这种情况?即使将函数全部包装在匿名函数声明中,错误仍然存在。。e、 g:对于var时间=2;次数>0;times-{funcArray.pushfunction callback{asyncTester2,false,null,callback;};}不要执行funcArray.pushfunctioncallback{asyncTester2,false,null,callback;},因为现在您希望每次调用数组中的函数时都会传递一个新的回调。只需执行funcArray.pushfunction{asyncTester2,false,null,asyncCb;}问题仍然存在。异步库应该将回调作为最后一个参数传递,因此我要么直接在asyncTester中使用它,这似乎不起作用,因为函数被调用,要么使用匿名包装函数,其中一个参数作为4传递给asyncTester函数。参数。这不是问题所在,即使我使用所有参数调用它,错误仍然存在。谢谢!我希望第一个函数调用在async.series调用之后返回回调函数,因此永远不会到达返回asyncCbnull的数字行。@Andre不客气。编写一系列测试程序来了解节点的事件循环是值得的。
[Function]
[Function]
[Function]
[Function]
[Function]
.series callback
[ 4, 4, 4, 4 ]
initiating call done!
setImmediate(function() {
   asyncTester(times, false, null, callback);
});
null
/Users/pmidge/workspace/personal/jstest/main.js:2079
        return asyncCb(null, number);
               ^

TypeError: asyncCb is not a function
    at asyncTester (/Users/pmidge/workspace/personal/jstest/main.js:2079:16)
    at test63 (/Users/pmidge/workspace/personal/jstest/main.js:2082:5)
    at Object.<anonymous> (/Users/pmidge/workspace/personal/jstest/main.js:2090:1)
    at Module._compile (module.js:413:34)
    at Object.Module._extensions..js (module.js:422:10)
    at Module.load (module.js:357:32)
    at Function.Module._load (module.js:314:12)
    at Function.Module.runMain (module.js:447:10)
    at startup (node.js:139:18)
    at node.js:999:3
//return the async callback when in a nested call
return asyncCb
    ? asyncCb(null, number)
    : null;