Bluebird

2021-07-26 18:05:23 KOA 大约 2 分钟

Promise对象已在ECMAScript 2015中被写入标准,且已被最新版本的浏览器和Node.js/IO.js所支持。bluebird是Node.js最出名的一个第三方Promise规范实现库,除了实现标准的Promise规范之外,Bluebird还提供了包装方法,可以快速地将Node.js回调风格的函数包装为Promise。它不仅完全兼容原生Promise对象,且比原生对象功能更强大。

# 安装

npm安装,cmd输入以下命令 官方文档 (opens new window)

npm i bluebird
1

# 使用

这里只简单介绍下,把不是异步的回调函数,包装成promise来使用;官方文档 (opens new window)

# Promise.promisify (opens new window)

将单个回调函数转换为promise函数。它不会改变原始函数并返回修改后的函数。

# 1.text

hello word
1
2
3
// test.js

const fs = require('fs');
const bluebird = require('bluebird');

// 回调函数的书写形式
// fs.readFile('./1.text', 'utf-8', (err, result) => {
//     console.log(result);
// })

// 把fs.readFile包装为promise
const readFile = bluebird.promisify(fs.readFile)

readFile('./1.text', 'utf-8').then(res => {
    console.log(res);
})

readFile('../1.text', 'utf-8').catch(err => {
    console.log(err);
})
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 输入结果
C:\Users\wangy\Desktop\test> node .\test.js
[OperationalError: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
  cause: [Error: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
    errno: -4058,
    code: 'ENOENT',
    syscall: 'open',
    path: 'C:\\Users\\wangy\\Desktop\\1.text'
  },
  isOperational: true,
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\wangy\\Desktop\\1.text'
}
hello word
PS C:\Users\wangy\Desktop\test> 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

# Promise.promisifyAll (opens new window)

获取一个充满函数的对象,并将每个函数转换为带有Async后缀的新函数(默认情况下)。它不会改变原有的功能,而是增加了新的功能。

const fs = require('fs');

// 把 fs模块 包装为promise
const bluebird = require('bluebird').promisifyAll(fs);

fs.readFileAsync('./1.text', 'utf-8').then(res => {
    console.log(res);
})

fs.readFileAsync('../1.text', 'utf-8').catch(err => {
    console.log(err);
})
1
2
3
4
5
6
7
8
9
10
11
12
# 输入结果
PS C:\Users\wangy\Desktop\test> node .\test.js
[OperationalError: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {
  cause: [Error: ENOENT: no such file or directory, open 'C:\Users\wangy\Desktop\1.text'] {  
    errno: -4058,
    code: 'ENOENT',
    syscall: 'open',
    path: 'C:\\Users\\wangy\\Desktop\\1.text'
  },
  isOperational: true,
  errno: -4058,
  code: 'ENOENT',
  syscall: 'open',
  path: 'C:\\Users\\wangy\\Desktop\\1.text'
}
hello word
PS C:\Users\wangy\Desktop\test> 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

提示

新方法后缀为Async,如fs.readFileAsync。它没有取代fs.readFile功能。

注意

Promise.promisifyPromise.promisifyAll为真正快速的包装器使用动态重新编译,因此调用它们应该只进行一次。

上次编辑于: 2023年7月4日 09:36