Nodejs 檢查 function 是否為 "thunk"

Nodejs 檢查 function 是否為 "thunk"

不知道有沒有人嘗試過一些方式來檢查 function 是否為 “thunk” ? (不是直接執行後再來判斷回傳值)

我目前只想到一個不是很好的方式,把 function 轉 string 再丟給 js parser 然後檢查回傳值是否為 function,並檢查 params 的長度,不知道有沒有其他好的方式?

11 回复

当然可以。检查一个函数是否为“thunk”可以通过多种方法实现。首先,我们需要明确什么是“thunk”。在JavaScript中,thunk通常是指一个接受参数的函数,并且返回另一个函数。例如:

function thunkExample(x) {
    return function() {
        console.log(x);
    };
}

在这个例子中,thunkExample 是一个thunk,因为它接受一个参数 x 并返回一个函数。

接下来,我们可以编写一个函数来检查给定的函数是否符合这种模式。这里是一个简单的实现:

function isThunk(func) {
    // 检查传入的是否为函数
    if (typeof func !== 'function') {
        return false;
    }

    // 尝试调用该函数并检查其返回值
    try {
        const result = func();
        // 检查返回值是否为函数
        return typeof result === 'function';
    } catch (error) {
        // 如果抛出错误,则认为它不是一个thunk
        return false;
    }
}

// 示例使用
const thunkExample = function(x) {
    return function() {
        console.log(x);
    };
};

console.log(isThunk(thunkExample)); // 输出: true
console.log(isThunk(() => {})); // 输出: false

上述代码中,isThunk 函数首先检查传入的是否为函数。如果传入的不是函数,则直接返回 false。接着尝试调用该函数并检查其返回值是否为函数。如果返回值是函数,则认为传入的函数是thunk,否则不是。

这种方法避免了将函数转换为字符串并解析的复杂性和潜在的性能问题。通过直接调用函数并检查其返回值,我们能够更简洁地判断函数是否为thunk。


thunk 翻译过来是什么, 有没有详细的定义

node 這邊主要由 co 帶進來的,可以參考他的 README.md

function () {
  return function (done) {
    done(err, data);
  }
}

这个形式的函数就是 thunk。

想不到特别好的方法来直接判断 thunk,不过 thunkify 一个 thunk 应该还是会返回一个 thunk 的。暂时还没有发现特别需要判断的需求。

主要是想檢查 function 的某個參數使否是 thunk, promise 或 node style 的 callback,如果不是這三種我想丟一個錯誤出去

是想检查函数名是"thunk"还是函数的其中某个参数是"thunk"

某個參數是 thunk

function x (thunk,callback) { var b = /(((?:[^()]+)))/i; var callee = arguments.callee; var match = b.exec(callee.toString()); ( match[1].split(’,’)[0] !== ‘thunk’ ) ? callback(false) : callback(true); }

x(‘thunk’, function ( flag ) { alert(flag); });

目前就想到这种方法

要检查一个函数是否为“thunk”,我们可以根据thunk的定义来进行判断。通常情况下,thunk是一个接受参数并返回一个没有参数的函数的函数。以下是一种简单的实现方式:

function isThunk(fn) {
  if (typeof fn !== 'function') return false;

  const { length } = fn;
  const result = fn();

  // Thunks usually accept arguments and return a function with no parameters
  return length === 1 && typeof result === 'function';
}

示例:

const thunk = x => () => x;
const nonThunk = () => {};

console.log(isThunk(thunk)); // true
console.log(isThunk(nonThunk)); // false

这个函数首先检查输入是否为一个函数,然后检查该函数的参数长度是否为1,并且返回值是否为一个函数。这样可以有效地判断一个函数是否为thunk。需要注意的是,这种方法可能无法涵盖所有thunk的情况,但可以作为一个基本的判断方法。

回到顶部