标注
Promision 回调函数
安装
npm install pify
使用量
import fs from 'fs';
import pify from 'pify';
// Promisify a single function.
const data = await pify(fs.readFile)('package.json', 'utf8');
console.log(JSON.parse(data).name);
//=> 'pify'
// Promisify all methods in a module.
const data2 = await pify(fs).readFile('package.json', 'utf8');
console.log(JSON.parse(data2).name);
//=> 'pify'
API 密码
pify( 输入, 选项 )
回返a Promise 所提供函数或模块的包装版本.
投入
类型 : Function | object
回调风格的函数或模块,其方法您想要混合 .
选项
类型 : object
多参数
类型 : boolean
默认 : false
默认情况下,被打包的函数只会从回调中返回第二个参数,这对大多数API都有效. 此选项可用于模块 request 返回多个参数。 打开此选项将使它返回调用的所有参数, 但不包括错误参数, 而不仅仅是第二个参数 。 这也适用于拒绝,它返回一系列所有回调参数,包括错误.
import request from 'request';
import pify from 'pify';
const pRequest = pify(request, {multiArgs: true});
const [httpResponse, body] = await pRequest('https://sindresorhus.com');
包含
类型 : Array<string | RegExp>
模块中混合的方法. 其余的方法将保持不变.
排除
类型 : Array<string | RegExp>
默认 : [/.+(?:Sync|Stream)$/]
模块中的方法 没有 用来打杂 名称结束的方法 'Sync' 默认除外.
排除主语
类型 : boolean
默认 : false
如果给定的模块本身是一个函数,则会被混合. 如果您只想要混合模块的方法, 请启用此选项 .
import pify from 'pify';
function fn() {
return true;
}
fn.method = (data, callback) => {
setImmediate(() => {
callback(null, data);
});
};
// Promisify methods but not `fn()`.
const promiseFn = pify(fn, {excludeMain: true});
if (promiseFn()) {
console.log(await promiseFn.method('hi'));
}
第一个出错
类型 : boolean
默认 : true
调用符是否有错误作为第一个参数 。 你会想设置这个 false 如果你在处理的API 没有错误 作为第一个论点,像 fs.exists(),一些浏览器API,Chrome扩展API等.
承诺模块
类型 : Function
自定义承诺模块将使用而不是本地模块 .
财务问题
这和Node.js的有什么不同 util.promisify? 吗?
- 证明在很久以前就已经存在过
util.promisify。 。 。 . - 说明 快点。 。 。 .
- Pify支持将整个模块/对象,而不仅仅是一个特定的方法进行包接.
- Pify 具有处理多个参数的能力等有用选项(
multiArgs) (中文(简体) ). - Pify 没有 魔法行为 对于某些节点方法,而是侧重于可预测性.
我怎么能用单一的分类方法?
阶级方法不受约束,所以当他们没有被召唤到阶级本身时,他们没有任何上下文. 你可以打乱整个班级 或者使用 .bind()。 。 。 .
import pify from 'pify';
import SomeClass from './some-class.js';
const someInstance = new SomeClass();
// ❌ `someFunction` can't access its class context.
const someFunction = pify(someClass.someFunction);
// ✅ The whole class is promisified and the `someFunction` method is called on its class.
const someClassPromisified = pify(someClass);
someClassPromisified.someFunction();
// ✅ `someFunction` is bound to its class before being promisified.
const someFunction = pify(someClass.someFunction.bind(someClass));
为什么 pify 在使用 TypeScript 时选择最后一个函数超载吗 ?
如果您正在使用 TypeScript 且您的输入有 函数超载,然后只选择最后的超载,并进行杂交.
如果您需要选择不同的超载, 请考虑使用类型断言 :
function overloadedFunction(input: number, callback: (error: unknown, data: number => void): void
function overloadedFunction(input: string, callback: (error: unknown, data: string) => void): void {
/* … */
}
const fn = pify(overloadedFunction as (input: number, callback: (error: unknown, data: number) => void) => void)
// ^ ? (input: number) => Promise<number>