回调在现代 JavaScript 中的替代品
这段代码将文件内容读入字符串数组中,回调函数将其解析为数字,并寂?骀数的个数。
在现代 JavaScript 中,我们有 Promise,Promise 可以用来替代异步 API 的回调。回调函数须要作为宿主函数的一个参数进行传递(多个宿主回调进行嵌套就形成了回调地狱),并且缺点和成功都只能在个中进行处理。而 Promise 对象可以让我们分开处理成功和缺点,还许可我们链式调用多个异尘事宜。
如不雅 readFileAsArray 函数支撑 Promise,我们可以如许应用它,如下所示:
- readFileAsArray('./numbers.txt')
- .then(lines => {
- const numbers = lines.map(Number);
- const oddNumbers = numbers.filter(n => n%2 === 1);
- console.log('Odd numbers count:', oddNumbers.length);
- })
- .catch(console.error);
我们在宿主函数的返回值上调用了一个函数来处理我们的需求,这个 .then 函数会把方才在回调版本中的那个行数组传递给这里的匿名函数。为了处理缺点,我们在结不雅上添加一个 .catch 调用,当产生缺点时,它会捕获到缺点并让我们拜访到这个缺点。
在现代 JavaScript 中已经支撑了 Promise 对象,是以我们可以很轻易的将其应用在宿主函数之中。下面是支撑 Promise 版本的 readFileAsArray 函数(同时支撑旧有的回调函数方法):
- const readFileAsArray = function(file, cb = () => {}) {
- return new Promise((resolve, reject) => {
- fs.readFile(file, function(err, data) {
- if (err) {
- reject(err);
- return cb(err);
- }
- const lines = data.toString().trim().split('\n');
- resolve(lines);
- cb(null, lines);
- });
- });
- };
我们使该函数返回一个 Promise 对象,该对象担保了 fs.readFile 的异步调用。Promise 对象裸露了两个参数,一个 resolve 函数和一个 reject 函数。
当有异常抛出时,我们可以经由过程向回调函数传递 error 来处理缺点,也同样可以应用 Promise 的 reject 函数。每当我们将数据交给回调函数处理时,我们同样也可以用 Promise 的 resolve 函数。
在这种同时可以应用回调和 Promise 的情况下,我们须要做的独一一件工作就是为这个回调参数设置默认值,防止在没有传递回调函数参数时,其被履行然后报错的情况。 在这个例子中应用了一个简单的默认空函数:()=> {}。
经由过程 async/await 应用 Promise
当须要持续调用异步函数时,应用 Promise 会让你的代码更轻易编写。赓续的应用回调会让工作变得越来越复杂,最终陷入回调地狱。
Promise 的出现改良了一点,Generator 的出现又改良了一点。 处理异步问题的最新解决方法是应用 async 函数,它许可我们将异步代码视为同步代码,使颇┞符体上加倍可读。
以下是应用 async/await 版本的调用 readFileAsArray 的例子:
- async function countOdd () {
- try {
- const lines = await readFileAsArray('./numbers');
- const numbers = lines.map(Number);
- const oddCount = numbers.filter(n => n%2 === 1).length;
- console.log('Odd numbers count:'
推荐阅读
市纪委经由过程对大年夜数据云与干部填报的家庭房产等情况的量化数据比对,敏捷排查出漏报瞒报人员,进而大年夜干部工作、生活相干事项着手,抓早抓小、大年夜严监管,教导抢救了大年夜批干部,起到了强大年夜的教导>>>详细阅读
本文标题:[译]理解Node.js事件驱动机制
地址:http://www.17bianji.com/lsqh/36743.html
1/2 1

网友点评
精彩导读
科技快报
品牌展示