【问题标题】:JS: Promise doesn't return valueJS:承诺不返回值
【发布时间】:2017-09-09 07:49:03
【问题描述】:

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

【问题讨论】:

  • 使用 Promise 不会让你的代码同步。 res.then(function (ret) { console.log(ret); })
  • 这里不需要讽刺@adeneo。你曾经是个初学者。
  • 好吧,您在实际使用过承诺、异步/等待和回调之前问过问题,所以您清楚地知道什么是异步,除非您只是复制/粘贴随机问题为了好玩?
  • 我的意思是 -> stackoverflow.com/questions/45948918/… 加油!
  • 显然我在理解这些事情时遇到了一些问题。我认为对我来说存在一些误解。这就是我问这个基本问题的原因。我仍然无法将 nadavvadan 的答案转换为 async/await 版本

标签: javascript node.js promise gm


【解决方案1】:

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

正确的解决方法是:

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,这很神奇,并且可以使异步代码同步。
  • 我并没有粗鲁的意思,如果是这样的话,对不起。
  • 我确实相信异步/等待是要走的路;稍后将编辑并添加示例。
  • 如果你能添加一个异步/等待示例会很棒
【解决方案2】:

您的代码应如下所示:

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 样式那样立即获得结果。

【讨论】:

    猜你喜欢
    • 2021-05-04
    • 1970-01-01
    • 2019-01-13
    • 2015-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多