Мне нужно получить значение асинхронной функции. Я пытался использовать Promise, но это не работает:
const res = new Promise(function (resolve, reject) {
gm(readStream).size({ bufferStream: true }, function (err, size) {
if (!err) resolve(size)
})
})
console.log(res)
В результате я получаю Promise { <pending> }
Обещания - это абстракция для обратных вызовов, а не магии. Они не могут сделать синхронный асинхронный код.
Правильное решение:
const res = new Promise(function (resolve, reject) {
gm(readStream).size({ bufferStream: true }, function (err, size) {
if (err) reject(err);
else resolve(size);
})
});
res.then(function(promiseResolutionValue) {
console.log(res)
})
Вы также можете использовать async/await
здесь:
const getSize = readStream => {
return new Promise(function (resolve, reject) {
gm(readStream).size({ bufferStream: true }, function (err, size) {
if (err) reject(err);
else resolve(size);
})
});
}
let printSize = async readStream => {
console.log('Size is ${await getSize(readStream)}');
}
Или, если вы используете NodeJS (версия 8+), вы можете адаптировать свою функцию для использования util.promisify
.
Другие библиотеки Promise
, такие как Bluebird
, также предлагают такие функции, чтобы легко преобразовать "стандартные" функции стиля узла (функции, которые имеют обратный вызов с err, data
качестве аргументов) в эквиваленты, эквивалентные обещанию.
Или просто используйте обратный вызов.
async
/ await
в пример, который является магическим и делает асинхронный код синхронным.
Ваш код должен выглядеть так:
const res = new Promise(function (resolve, reject) {
gm(readStream).size({ bufferStream: true }, function (err, size) {
if (!err) resolve(size)
else reject(err)
})
})
function onResolved(data) {
console.log('data: ', data);
}
function onRejected(err) {
console.log('err:', err);
}
res.then(onResolved, onRejected);
Promise не делает ваш код синхронным, он позволяет вам контролировать, когда вы хотите получить результат, а не сразу, как стиль callback
.
res.then(function (ret) { console.log(ret); })