JS:承诺没有回报价值

use*_*695 1 javascript node.js promise gm

我需要获取异步函数的值.我试图使用Promise,但这不起作用:

const res = new Promise(function (resolve, reject) {
  gm(readStream).size({ bufferStream: true }, function (err, size) {
    if (!err) resolve(size)
  })
})
console.log(res)
Run Code Online (Sandbox Code Playgroud)

我得到的结果是 Promise { <pending> }

nad*_*dan 7

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)
})
Run Code Online (Sandbox Code Playgroud)

你也可以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)}`);
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您正在使用NodeJS(版本8+),您可能可以调整您的功能使用util.promisify.
其他Promise库,例如Bluebird,也提供这样的函数,以便轻松地将"标准"节点样式函数(具有带有err, data作为参数的回调的函数)转换为promise返回等价物.

或者只是使用回调.

  • 我完全不表示粗鲁,对不起,如果那样的话。 (2认同)