Nodejs Callback Callback

Nodejs Callback Callback

在写个判断函数时,大概是想可以这样调用

validStr('xxx', 2, 10)

但是又想在当判断的过程抛出异常

于是写成

function validStr(str, min, max){
    if(){
        ...
        return true;
    }
    else{
        ...
        this.callback();
        return false;
    }
}

于是调用也变成了

validStr.call({callback: throwError.bind(null, 'error!')}, str, 2, 10)

嘶 等等 怎么有种怪怪的赶脚

既然都这样调用了 那这样是不是更好点呢

function validStr(str, min, max, callback){
    if(){
        ...
        return true;
    }
    else{
        ...
        callback();
        return false;
    }
}
validStr(str, 2, 10, throwError.bind(null, 'error!'))

洗澡睡觉!


3 回复

Node.js Callback Callback

在编写一个字符串验证函数时,你可能希望这样调用:

validStr('xxx', 2, 10);

但有时你也希望在验证过程中能够抛出异常。于是你可能会写出这样的代码:

function validStr(str, min, max) {
    if (str.length >= min && str.length <= max) {
        return true;
    } else {
        // 这里应该有一个回调来处理错误情况
        this.callback();
        return false;
    }
}

然后你的调用方式会变成这样:

validStr.call({callback: throwError.bind(null, 'error!')}, str, 2, 10);

但这样做似乎有点怪异。既然都使用了回调,为什么不直接将回调作为参数传递给函数呢?这样代码会更清晰易懂。

修改后的代码可以这样写:

function validStr(str, min, max, callback) {
    if (str.length >= min && str.length <= max) {
        return true;
    } else {
        // 使用传入的回调函数处理错误
        callback('error!');
        return false;
    }
}

// 调用函数并传入回调
validStr(str, 2, 10, throwError);

其中 throwError 函数定义如下:

function throwError(errorMsg) {
    console.error(errorMsg);
    throw new Error(errorMsg);
}

示例代码解析

  1. 函数定义

    • validStr 函数接受四个参数:str(要验证的字符串),minmax(字符串长度的最小值和最大值),以及一个回调函数 callback
    • 如果字符串长度在指定范围内,则返回 true
    • 否则,调用 callback 函数,并传递错误信息。
  2. 回调函数

    • throwError 是一个简单的回调函数,它接收一个错误信息,并将其打印到控制台,然后抛出一个错误。
  3. 调用函数

    • 调用 validStr 函数时,传入字符串 'xxx'、最小长度 2 和最大长度 10,同时传入 throwError 函数作为回调。

通过这种方式,代码更加简洁明了,逻辑也更清晰。这样不仅能够处理错误,还能保持代码的一致性和可读性。


不是异步的,直接throw就行了

在Node.js中,使用回调函数(callback)是一种常见的处理异步操作的方式。你提到的需求是通过一个函数来验证字符串长度,并在验证失败时抛出异常或执行某个回调函数。

以下是改进后的实现方式:

function validStr(str, min, max, callback) {
    if (str.length < min || str.length > max) {
        callback(new Error('Invalid string length'));
        return false;
    } else {
        return true;
    }
}

function throwError(error) {
    throw error;
}

// 使用示例
try {
    validStr('short', 5, 10, throwError);
} catch (error) {
    console.error(error.message); // 输出 "Invalid string length"
}

在这个例子中:

  • validStr 函数接收一个字符串 str 和两个数字 minmax,以及一个回调函数 callback
  • 如果字符串长度不在指定范围内,则调用 callback 并传递一个错误对象。
  • 在调用 validStr 时,使用 throwError 函数作为回调函数来抛出错误。
  • 由于我们希望捕获并处理错误,所以将 validStr 的调用包裹在一个 try...catch 块中。

这种方式既保持了回调函数的灵活性,又可以在需要时进行错误处理。

回到顶部