如何将 JavaScript 回调转换为 Promise?方法介绍


当前第2页 返回上一页

1

2

3

4

5

6

7

8

9

10

11

12

13

const fs = require('fs');

const util = require('util');

 

const readFile = util.promisify(fs.readFile);

 

(async () => {

    try {

        const content = await readFile('./sample.txt', 'utf-8');

        console.log(content);

    } catch (err) {

        console.error(err);

    }

})();

你只能在用 async 创建的函数中使用 await 关键字,这也是为什么要使用函数包装器的原因。函数包装器也被称为立即调用的函数表达式。

如果你的回调不遵循这个特定标准也不用担心。 util.promisify() 函数可让你自定义转换是如何发生的。

注意: Promise 在被引入后不久就开始流行了。 Node.js 已经将大部分核心函数从回调转换成了基于 Promise 的API。

如果需要用 Promise 处理文件,可以用 Node.js 附带的库(https://nodejs.org/docs/lates...)。

现在你已经了解了如何将 Node.js 标准样式回调隐含到 Promise 中。从 Node.js 8 开始,这个模块仅在 Node.js 上可用。如果你用的是浏览器或早期版本版本的 Node,则最好创建自己的基于 Promise 的函数版本。

创建你自己的 Promise

让我们讨论一下怎样把回调转为 util.promisify() 函数的 promise。

思路是创建一个新的包含回调函数的 Promise 对象。如果回调函数返回错误,就拒绝带有该错误的Promise。如果回调函数返回非错误输出,就解决并输出 Promise。

先把回调转换为一个接受固定参数的函数的 promise 开始:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

const fs = require('fs');

 

const readFile = (fileName, encoding) => {

    return new Promise((resolve, reject) => {

        fs.readFile(fileName, encoding, (err, data) => {

            if (err) {

                return reject(err);

            }

 

            resolve(data);

        });

    });

}

 

readFile('./sample.txt')

    .then(data => {

        console.log(data);

    })

    .catch(err => {

        console.log(err);

    });

新函数 readFile() 接受了用来读取 fs.readFile() 文件的两个参数。然后创建一个新的 Promise 对象,该对象包装了该函数,并接受回调,在本例中为 fs.readFile()

reject Promise 而不是返回错误。所以代码中没有立即把数据输出,而是先 resolve 了Promise。然后像以前一样使用基于 Promise 的 readFile() 函数。

接下来看看接受动态数量参数的函数:

1

2

3

4

5

6

7

8

9

10

11

12

13

const getMaxCustom = (callback, ...args) => {

    let max = -Infinity;

 

    for (let i of args) {

        if (i > max) {

            max = i;

        }

    }

 

    callback(max);

}

 

getMaxCustom((max) => { console.log('Max is ' + max) }, 10, 2, 23, 1, 111, 20);

第一个参数是 callback 参数,这使它在接受回调的函数中有点与众不同。

转换为 promise 的方式和上一个例子一样。创建一个新的 Promise 对象,这个对象包装使用回调的函数。如果遇到错误,就 reject,当结果出现时将会 resolve

我们的 promise 版本如下:

1

2

3

4

5

6

7

8

9

10

const getMaxPromise = (...args) => {

    return new Promise((resolve) => {

        getMaxCustom((max) => {

            resolve(max);

        }, ...args);

    });

}

 

getMaxCustom(10, 2, 23, 1, 111, 20)

    .then(max => console.log(max));

在创建 promise 时,不管函数是以非标准方式还是带有许多参数使用回调都无关紧要。我们可以完全控制它的完成方式,并且原理是一样的。

总结

尽管现在回调已成为 JavaScript 中利用异步代码的默认方法,但 Promise 是一种更现代的方法,它更容易使用。如果遇到了使用回调的代码库,那么现在就可以把它转换为 Promise。

在本文中,我们首先学到了如何 在Node.js 中使用 utils.promisfy() 方法将接受回调的函数转换为 Promise。然后,了解了如何创建自己的 Promise 对象,并在对象中包装了无需使用外部库即可接受回调的函数。这样许多旧 JavaScript 代码可以轻松地与现代的代码库和混合在一起。

更多编程相关知识,请访问:编程学习!!

以上就是如何将 JavaScript 回调转换为 Promise?方法介绍的详细内容,更多文章请关注木庄网络博客

返回前面的内容

相关阅读 >>

javascript什么叫事件源

javascript中如何替换字符串?3种方法介绍

html中如何使用javascript

html5 canvas绘图之drawimage() 方法的详细介绍(代码示例)

javascript web workers的构建块及5个使用场景

js中什么是原型链

html获取javascript变量值的方法有哪些

javascript如何输入数据

详解js中值传递和引用传递的区别

javascript中this什么意思

更多相关阅读请进入《javascript》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...