2

我需要获取一个异步函数的值。我尝试使用 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> }

4

2 回答 2

9

Promise 是回调的抽象,而不是魔术。他们不能使异步代码同步。

正确的解决方案是:

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作为参数的回调的函数)转换为返回承诺的等效函数。

或者只是使用回调。

于 2017-09-08T16:25:26.553 回答
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样式。

于 2017-09-08T16:30:37.980 回答