最近在学习nodejs这个服务端开发平台的知识点。一边根据文档学习,一边在写几行测试代码实现有助于了解,在学到回调函数的时候却遇到了callback is not a function的问题。按理说我按照文档代码写的,应该不会出错的,下面是我一开始的时候的代码单纯为了看效果:

function doSomething(args, callback) {
    somethingComplicated(args);
    process.nextTick(callback);
}
doSomething(function onEnd() {
    compute();
});

function somethingComplicated(){
    console.log("this is first function!");
}
function compute() {
    console.log("this is second function,callback");
}

然后直接运行这个js文件,控制台输出的结果如下:
又图可以看到callback is not a function,也是就说这个回调函数出错了,按理说按照文档直接写的应该不会出错的才对的啊,痛苦的表情中…

输出结果
后来再认真看文档,毕竟不懂还是要问文档嘛!
原来在回调函数中,第一个参数不是传给回调函数的,也就是说没有任何参数传给callback,所以callback当然 is not a funciotn 了。

针对上面的问题,以下有两种解决方法:

方法一:改写doSomething函数,把第一个入参函数变成回调函数,实际操作如下所示:

function doSomething(args, callback) {
     somethingComplicated(args);
    if (arguments.length==1 && 'function'==typeof args){
        callback = args;
    }
    process.nextTick(callback);
}
doSomething(function onEnd() {
    compute();
});

function somethingComplicated(){
    console.log("this is first function!");
}
function compute() {
    console.log("this is second function,callback");
}

方法二,把第一个不传递的参数设置为null,这样第二个参数函数既为回调函数了

function doSomething(args, callback) {
     somethingComplicated(args);
    process.nextTick(callback);
}
doSomething(null,function onEnd() {
    compute();
});

function somethingComplicated(){
    console.log("this is first function!");
}
function compute() {
    console.log("this is second function,callback");
}

无论哪种方法,最后测试都成功了,运行结果如下所示:
在这里插入图片描述

Logo

基于 Vue 的企业级 UI 组件库和中后台系统解决方案,为数万开发者服务。

更多推荐