简体   繁体   English

JS:承诺不返回价值

[英]JS: Promise doesn't return value

I need to get a value of an asynchronous function. 我需要获取一个异步函数的值。 I tried to use Promise, but that does not work: 我尝试使用Promise,但这不起作用:

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

The result I get is Promise { <pending> } 我得到的结果是Promise { <pending> }

Promises are an abstraction for callbacks, not magic. 承诺是回调的抽象,而不是魔术。 They can't make asynchronous code synchronous. 他们无法使异步代码同步。

The correct solution is: 正确的解决方案是:

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)
})

You could also use async / await here: 您也可以async / await这里使用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)}`);
}

Or, if you're using NodeJS (Version 8+), you might be able to adapt your function to use util.promisify . 或者,如果您使用的是NodeJS(版本8以上),则可以使您的函数适应使用util.promisify
Other Promise libraries, such as Bluebird , also offer such functions, to easily convert 'standard' node-style functions (functions that have a callback with err, data as arguments) into promise-returning equivalents. 其他Promise库(例如Bluebird )也提供了此类功能,可以轻松地将“标准”节点样式的功能(具有以err, data回调err, data作为参数的回调的功能)转换为可兑现的等价物。

Or just use the callback. 或者只是使用回调。

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 does not make your code synchronous, it lets you control when you want to get the result, not immediately like callback style. Promise不会使您的代码同步,它使您可以控制何时要获得结果,而不必像callback样式那样立即进行控制。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM