Nodejs 语法问题求解~这里好奇怪呀~

Nodejs 语法问题求解~这里好奇怪呀~

var thunkify = require(‘thunkify’);
var fs = require(‘fs’);

var read = thunkify(fs.readFile);

read(‘books.json’, ‘utf8’)(function(err, res){ console.log(res); });

thunkify无非就是包一层方法,让所有方法的callback统一 但是 为什么调用时候

read(参数)(方法);

这里好奇怪!

这是什么语法? 如何来理解


9 回复

当然可以!你提到的代码片段展示了如何使用 thunkify 库将一个回调风格的函数转换为支持生成器(generator)的函数。这种模式可以帮助你在处理异步操作时保持代码的简洁和可读性。

示例代码

var thunkify = require('thunkify');
var fs = require('fs');

// 将 fs.readFile 转换为 thunk 风格
var read = thunkify(fs.readFile);

// 调用 read 方法并传递参数
read('books.json', 'utf8')(function(err, res) {
    console.log(res);
});

解释

  1. 引入库

    var thunkify = require('thunkify');
    var fs = require('fs');
    

    这里我们引入了 thunkify 和 Node.js 的文件系统模块 fs

  2. 将 fs.readFile 转换为 thunk 风格

    var read = thunkify(fs.readFile);
    

    thunkify 函数将 fs.readFile 转换为一个新的函数 read,该函数返回一个接受回调的函数。这使得我们可以以更统一的方式处理异步操作。

  3. 调用 read 方法

    read('books.json', 'utf8')(function(err, res) {
        console.log(res);
    });
    

    这里是关键部分。read 方法被调用,并传入文件名 'books.json' 和编码 'utf8'。然后,返回的函数被立即调用,并传入一个回调函数 (function(err, res) { ... })

理解这种语法

  • read('books.json', 'utf8') 返回的是一个函数。
  • 这个返回的函数 (function(err, res) { ... }) 是一个普通的回调函数,用于处理异步操作的结果。

这种语法看起来有点奇怪,因为它涉及到了函数的嵌套调用。但它的目的是将回调风格的异步操作转换为更易于管理的形式,特别是当你需要在生成器中使用这些操作时。

总结

这种语法是为了将传统的回调风格的异步操作转换为更易于管理和组合的形式。通过这种方式,你可以更容易地处理复杂的异步流程,而不需要陷入回调地狱(callback hell)。希望这能帮助你更好地理解这个例子!


这叫做柯里化, 好好了解了解js吧,ES6函数式痕迹会非常明显

哈哈,我喜欢说 咖喱化

这是不彻底的柯里化,跟ES6没什么关系。

thunkify返回的read方法,它接受参数fileName, encodeType后再返回一个方法read2,read2接受一个回调函数callback作为参数,并将以 [fileName, encodeType, (包装过的callback)] 作为参数执行先前thunkify时传入的方法fs.readFile。

见此 https://github.com/visionmedia/node-thunkify/blob/master/index.js

逻辑并不复杂。

科利华好好研究下,没怎么正经搞过js,所以不是特别熟悉 最近一段时间的折腾 已经有了一定了解 上一次搞脚本语言还是15年前 天天啃Perl的时候

感谢的说,其实thunkify的过程还算了解 但是 就是语法狠奇特

请教,这个thunkify有啥应用场景?

var res = yield thunkify之后的异步方法(参数);

我是为了这个

像同步方法一样取执行异步方法

你提到的代码中使用了thunkify库,它的作用是将传统的带有回调函数的API转换为支持Thunk风格的API。这种风格允许你更灵活地处理异步操作,特别是与生成器(generators)和协程(coroutines)结合时。

在你的例子中,read函数被转换为一个可以接受参数并返回一个函数的函数。这就是所谓的**柯里化(Currying)**技术。柯里化是一种将接受多个参数的函数转换成一系列接受单个参数的函数的技术。

具体来说,在你的代码中:

var read = thunkify(fs.readFile);

这行代码创建了一个新的函数read,它现在接受文件名和编码作为参数,并返回一个函数,该函数最终接受一个回调函数来处理结果。

当你调用read('books.json', 'utf8')时,它实际上不会立即执行文件读取操作,而是返回一个新的函数。这个新函数需要最后接收一个回调函数作为参数来完成整个过程。因此,完整的调用形式如下:

read('books.json', 'utf8')(function(err, res) {
    console.log(res);
});

第一部分read('books.json', 'utf8')创建了一个准备好的函数,准备好去读取名为books.json的文件,并且使用utf8编码。第二部分(function(err, res) { console.log(res); })是一个回调函数,当文件读取完成后会被调用。

这种方式让你能够以一种更模块化的方式组织异步逻辑,使得代码更容易理解和维护。

如果你想要更简单地处理文件读取,可以直接使用现代JavaScript中的fs.promises API,并配合async/await语法糖来简化代码,例如:

const fs = require('fs').promises;

async function readFile() {
    try {
        const data = await fs.readFile('books.json', 'utf8');
        console.log(data);
    } catch (err) {
        console.error(err);
    }
}

readFile();

这种方法避免了回调地狱,使异步代码看起来更像同步代码,更加直观易懂。

回到顶部