JS:Promise不返回值

3
我需要获取异步函数的值。我尝试使用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
使用 Promise 并不会使您的代码同步。res.then(function (ret) { console.log(ret); }) - Keith
9
不需要在这里挖苦 @adeneo。你曾经也是个初学者。 - Duncan Thacker
1
嗯,你之前问过一个问题,其中实际上使用了 promises、async/await 和 callbacks,所以你显然知道什么是异步的,除非你只是为了好玩而随意复制/粘贴问题? - adeneo
我是说 -> https://dev59.com/KaTja4cB1Zd3GeqPGr9K 加油! - adeneo
显然,我在理解这些事情方面遇到了一些问题。我认为对于我来说存在一些误解。这就是为什么我要问这个基本问题的原因。尽管如此,我仍然无法将nadavvadan的答案转换为async/await版本。 - user3142695
2个回答

10

承诺是回调的一个抽象,而不是魔法。它们不能使异步代码同步。

正确的解决方案是:

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

或者只需使用回调函数。


1
我认为你本可以更友善一些,但这是正确的答案! - Duncan Thacker
你也可以在这个例子中添加 async / await,这种方式有点神奇,可以让异步代码看起来像同步代码。 - msanford
2
我一点也不是有意冒犯,如果让你误解了,我很抱歉。 - nadavvadan
我相信async/await是正确的选择;稍后会编辑并添加一个例子。 - nadavvadan
1
如果您能添加一个async/await示例,那就太好了。 - user3142695
@user3142695 - 已添加 - nadavvadan

1
你的代码应该长这样:

Your code should be looked like this:

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)不能使您的代码同步,它允许您控制何时获取结果,而不是像“回调”样式那样立即获取。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接