【发布时间】:2019-03-28 10:56:43
【问题描述】:
我有一个从 redis-connection-pool 创建的 Redis 池对象。它寻找一个键来获取所有图像标识符的数组。然后,对于每个元素,都会查找另一个 Redis 键,以便将值附加到一个 JSON 对象中。该对象作为对GET 请求的响应返回。
出于某种奇怪的原因(也许是 Redis 错误?),当 Promise 使用正确的数据解析时,使用此 Promise 的函数总是看到一个 undefined 对象。
最初的尝试
async function allImageData() {
var configPool = redisPools.configPool;
var resp = {};
var images = [];
var imageDetails = {};
//
await configPool.get('allImages', async (err, reply) => {
if (err) {
resp = {
'data': {}
}
reject(resp)
} else {
if (reply === null) {
resp = {
'data': {}
}
reject(resp)
} else {
imageDetails = JSON.parse(reply)
images = imageDetails['allImages']
return new Promise(function (resolve, reject) {
imageDetailsCache(images).then(function (result) {
resp = {
'data': result
}
resolve(resp) //Correct data; but, received as undefined
}).catch(function (result) {
resp = {
'data': {}
}
reject(resp)
})
})
}
}
})
}
下一次尝试
Promise 在 Redis get 结束后返回。
async function allMachineData() {
var configPool = redisPools.configPool;
var resp = {};
var images = [];
var imageDetails = {};
//
await configPool.get('allImages', async (err, reply) => {
if (err) {
resp = {
'data': {}
}
reject(resp)
} else {
if (reply === null) {
resp = {
'data': {}
}
reject(resp)
} else {
imageDetails = JSON.parse(reply)
images = imageDetails['allImages']
}
}
})
return new Promise(function (resolve, reject) {
// images array is empty; so, received as empty object
imageDetailsCache(images).then(function (result) {
resp = {
'data': result
}
resolve(resp)
}).catch(function (result) {
resp = {
'data': {}
}
reject(resp)
})
})
}
【问题讨论】:
-
请注意
.get()使用 callback 机制,它确实不返回Promise,await常量或 void没有效果。 -
但是我在回调中返回了一个 Promise。第二次尝试怎么样?
-
你在两次尝试中都用
.get做同样的事情 -
检查
get是否返回一个promise ...尝试添加await configPool.get( .....).then(result => result)如果你没有得到一个错误,那么get返回一个promise,如果你得到一个错误那么你会更好地理解 Neverever 的评论 -
你还在 get 回调中使用了
reject(resp)...这是什么reject函数?