Во-первых, вам нужно понять, как работает nodeFunction
. В качестве последнего аргумента требуется функция обратного вызова. Этот обратный вызов принимает два аргумента, первый - error
, а второй - данные. Рассмотрим, например require("fs").readFile
:
// This is the callback
function callback (error, data) {
if (error) {
console.error('There was an error', error)
} else {
console.log('This is the data', data)
}
}
require('fs').readFile('my-file.txt', callback)
Обратите внимание, что это соглашение, нет ничего в самом JS, что усиливает его.
Перейдем к Promise.promisify
сейчас. Этот метод принимает nodeFunction
и возвращает его версию. Это более или менее то, что он делает:
function promisifiedReadFile (filePath) {
return new Promise(function (fulfill, reject) {
require('fs').readFile(path, function (error, data) {
if (error) { reject(error) } else { fulfill(data) }
})
})
}
Это немного многословным, но как вы можете видеть, теперь у вас есть версия readFile
, которая возвращает обещание вместо принятия обратного вызова. Конечно, этот пример жестко закодирован для readFile
, Promise.promisify
работ для любого nodeFunction
вместо:
const promisifiedReadFile = Promise.promisify(require('fs').readFile)
Два promisifiedReadFile
методов работают таким же образом.
Последнее, Promise.promisifyAll
принимает объект, проходит через него и находит все методы, затем применяет Promise.promisify
к каждому из них.
Итак, если вы позвоните Promise.promisifyAll(require('fs'))
, вы получите версию модуля fs
, где все методы возвращают обещания вместо принятия обратных вызовов.
О вашем примере я не уверен, что вы пытаетесь достичь, но методы, которые вы указали не nodeFunctions
, поэтому они не могут быть promisified.
Можете вы добавить ссылку на документацию? – Gpx
У вас нет ** callback ** на ваших объектных функциях, поэтому не имеет смысла обещать. Promisify используется, когда у вас есть стиль обратного вызова, и вы хотите работать с ним в качестве обещания. Лучше сказать, чего вы хотите достичь, чтобы дать лучший совет. – Hosar
Если в коде нет ничего асинхронного, вы не можете его обещать. – Bergi