JS:Promise 没有 return 值
JS: Promise doesn't return value
我需要获取一个异步函数的值。我尝试使用 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> }
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
,也提供了这样的函数,可以轻松地将 'standard' 节点式函数(具有回调函数 err, data
作为参数的函数)转换为 promise -返回等价物。
或者直接使用回调。
您的代码应如下所示:
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
风格那样立即。
我需要获取一个异步函数的值。我尝试使用 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> }
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
,也提供了这样的函数,可以轻松地将 'standard' 节点式函数(具有回调函数 err, data
作为参数的函数)转换为 promise -返回等价物。
或者直接使用回调。
您的代码应如下所示:
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
风格那样立即。