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, data
callback函数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
风格那样。