Интерпретация Node-модуля четвертого util-модуля, который был представлен ранее.вм-модуль,Буферный модуль,.
- передача стиля
- вывод отладки
- Устаревший API
передача стиля
обратный вызов преобразует обещание
Для функций, которые передают обратный вызов error-first в качестве последнего параметра функции (например, fs.readFile('./filename', (err, data) => {})), util предоставляет метод promisify(original) to convert Функция этого типа преобразуется в форму, возвращающую обещание.
Возьмите fs.readFile в качестве примера.
const fs = require('fs');
fs.readFile('./h.js', (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data.toString());
})
// 使用util.promisify转换后
const fs = require('fs');
const util = require('util');
const readFilePromise = util.promisify(fs.readFile);
readFilePromise('./h.js')
.then((data) => {
console.log(data.toString());
}, (err) => {
console.error(err);
});
Реализация
После выполнения обещания возвращается новая функция.Результатом выполнения новой функции является обещание.Новая функция вызовет исходный метод и автоматически добавит обратный вызов типа error-first.Согласно результату выполнения исходного , считается, что разрешить или отклонить, простая версия кода выглядит следующим образом:
function promisify(original) {
function fn(...args) {
const promise = createPromise();
try {
original.call(this, ...args, (err, ...values) => {
if (err) {
promiseReject(promise, err);
} else {
promiseResolve(promise, values[0]);
}
});
} catch (err) {
promiseReject(promise, err);
}
return promise;
}
return fn
}
Модуль UTIL также предоставляет собой пользовательский режим преобразования Щел для вырыва (util.promisify.custom атрибут по происхождению », например, для чтения файла отключенного файла, util.promisify.custom должен быть определен до Util.promisify
const fs = require('fs');
const util = require('util');
fs.readFile[util.promisify.custom] = (fileName) => {
return Promise.reject('not allowed');
}
const readFilePromise = util.promisify(fs.readFile);
readFilePromise('./h.js')
.then((data) => {
console.log(data.toString());
}, (err) => {
console.error(err); // not allowed
});
Обещай обратный вызов
Метод callbackify в util является полной противоположностью promisify.Callbackify используется для преобразования асинхронных (или возвращающих промисов) функций в типы, соответствующие стилю обратного вызова с первой ошибкой.
const util = require('util');
const fn = () => {
return 'fn executed'
};
function delay(second, fn) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(fn());
}, second);
});
}
delay(1000, fn)
.then((data) => {
console.log(data); // fn executed
});
// 使用util.callbackify转换后
const delayFn = util.callbackify(delay);
delayFn(1000, fn, (err, data) => {
if (err) {
console.error(err);
return;
}
console.log(data); // fn executed
});
Есть одна ситуация, требующая внимания: если промис отклонен(null || 0 || false), то ошибка обратного вызова оценивается как отрицательная, и программа продолжает выполнять console.log(data), который на самом деле неверно. Таким образом, callbackify выполняет специальную обработку для этой ситуации (создает ошибку, помещает исходную информацию в свойство причины ошибки и передает ошибку в окончательную функцию обратного вызова).
function callbackifyOnRejected(reason, cb) {
if (!reason) {
const newReason = new ERR_FALSY_VALUE_REJECTION();
newReason.reason = reason;
reason = newReason;
Error.captureStackTrace(reason, callbackifyOnRejected);
}
return cb(reason);
}
Реализация
Реализованная логика состоит в том, чтобы вызвать исходную функцию original, чтобы затем вызвать метод обратного вызова.
function callbackify(original) {
function callbackified(...args) {
const maybeCb = args.pop();
const cb = (...args) => { Reflect.apply(maybeCb, this, args); };
Reflect.apply(original, this, args)
.then((ret) => process.nextTick(cb, null, ret),
(rej) => process.nextTick(callbackifyOnRejected, rej, cb));
}
return callbackified;
}
вывод отладки
util.debuglog(section)
Метод отладки используется для выборочного вывода отладочной информации в соответствии с переменной среды NODE_DEBUG, например, в следующем примере.
//index.js
const util = require('util');
const debuglog = util.debuglog('foo-bar');
debuglog('hello from foo [%d]', 123);
// 执行index文件
node index.js // 没有输出
NODE_DEBUG=foo-bar node index.js //FOO-BAR 18470: hi there, it's foo-bar [2333]
NODE_DEBUG можно разделить запятыми, если вы хотите вывести несколько разделов, а NODE_DEBUG также поддерживает форму подстановочных знаков (для версии узла требуется 10)
NODE_DEBUG=fs,net,tls // 多个section
NODE_DEBUG=foo* // 通配符
Приведенная выше функция журнала отладки поддерживает заполнители при выполнении.На самом деле нижний уровень использует метод util.format.
util.format
util.format используется для замены заполнителей, а разные типы данных представлены разными заполнителями.
%s | нить |
---|---|
%d | Целое число или число с плавающей запятой |
%i | целое число |
%f | Плавать |
%j | JSON |
%o | |
%O | Объект (за исключением неперечислимых свойств) |
%% | выход % |
Метод UTIL.inspect фактически используется при форматировании выходной строки для объекта. Разница между% o и% o заключается в том, что элементы конфигурации различны при вызове метода проверки.
%o 传入util.inspect的配置项是 { showHidden: true, showProxy: true }
util.inspect
Строка формата util.inspect для объекта, чтобы выполнить операцию и предоставить персонализированный CI
const util = require('util');
var child = {
"name": "child",
"age": 18,
"friends": [
{
"name": "randal",
"age" : 19,
"friends": [
{
"name": "Kate",
"age": 18
}
]
}
],
"motto": "Now this is not the end. It is not even the beginning of the end. But it is, perhaps, the end of the beginning."
}
console.log(util.inspect(child, { compact: false, depth: null, breakLength: 80}));
compact используется для отображения каждого атрибута в отдельной строке
глубина используется для управления уровнем отображения, по умолчанию 2
breakLength используется для максимального количества текста в строке за пределами разрыва строки.
Более подробные параметры и интерпретацияapi
Устаревший API
Используйте метод util.deprecate для вывода информации об отброшенных запросах на терминал для отброшенных API.
const util = require('util');
const oldFn = () => {
console.log('old fn');
};
class oldClass {
constructor() {
console.log('old class');
}
}
const fn1 = util.deprecate(oldFn, 'deprecated fn');
const fn2 = util.deprecate(oldClass, 'deprecated class');
fn1();
new fn2();
// 输出
old fn
old class
(node:18001) DeprecationWarning: deprecated fn
(node:18001) DeprecationWarning: deprecated class
Реализация
function deprecate(fn, msg, code) {
let warned = false;
function deprecated(...args) {
if (!warned) {
warned = true;
if (code !== undefined) {
if (!codesWarned[code]) {
process.emitWarning(msg, 'DeprecationWarning', code, deprecated); // emit警告信息
codesWarned[code] = true; // 避免同一errorCode重复提示
}
} else {
process.emitWarning(msg, 'DeprecationWarning', deprecated);
}
}
if (new.target) { // class类型
return Reflect.construct(fn, args, new.target);
}
return fn.apply(this, args); // 函数类型
}
return deprecated;
}
Элементы конфигурации командной строки, относящиеся к этому
параметры командной строки | ||
---|---|---|
--no-deprecation --no-warnings |
noDeprecation | |
--trace-deprecation --trace-warnings |
traceDeprecation | |
Выдает исключение ошибки | --throw-deperecation | throwDeprecation |
разное
В дополнение к трем инструментам, упомянутым выше, util.types также предоставляет очень богатый метод идентификации типов (isGeneratorFunction, isWeakSet, isPromise, isArrayBuffer) и т. д. В будущем, когда вам понадобится оценка типа, вы можете рассмотреть возможность использования шаблона util. эти методы.