JS:Promise不会返回值

我需要得到一个asynchronous函数的值。 我试图使用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> }

承诺是callback的抽象,而不是魔术。 他们不能使asynchronous代码同步。

正确的解决scheme是:

 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这里使用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 )也提供这样的function,可以轻松地将“标准”节点样式函数(具有err, datacallback函数err, data作为参数的函数)转换为承诺返回的等价类。

或者只是使用callback。

你的代码应该看起来像这样:

 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风格那样。