JS: Обещание не возвращает значение

1

Мне нужно получить значение асинхронной функции. Я пытался использовать 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> }

  • 2
    Использование обещаний не делает ваш код синхронным. res.then(function (ret) { console.log(ret); })
  • 6
    Не нужно быть саркастичным здесь @adeneo. Вы были новичком однажды.
Показать ещё 3 комментария
Теги:
promise
gm

2 ответа

7
Лучший ответ

Обещания - это абстракция для обратных вызовов, а не магии. Они не могут сделать синхронный асинхронный код.

Правильное решение:

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 качестве аргументов) в эквиваленты, эквивалентные обещанию.

Или просто используйте обратный вызов.

  • 0
    Я думаю, вы могли бы быть лучше, но это правильный ответ!
  • 0
    Вы также можете добавить async / await в пример, который является магическим и делает асинхронный код синхронным.
Показать ещё 4 комментария
1

Ваш код должен выглядеть так:

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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню