我有一个从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)
})
})
}
}
})
}
下一次尝试
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)
})
})
}
答案 0 :(得分:0)
尝试使用
await configPool.get('allImages', async (err, reply) => {
首先,.get
不会返回承诺,因此await
设置没有任何意义
其次,您不在回调中使用await,因此无需使其async
似乎可以简化您的代码
首先,由于您要返回一个Promise,所以将configPool.get
包装在一个Promise中,该Promise将在回调中被解决/拒绝
在那之后,这只是一个承诺链的问题,因为您的代码暗示imageDetailsCache
返回了一个承诺,所以很简单:
function allImageData() {
return new Promise((resolve, reject) => {
redisPools.configPool.get('allImages', (err, reply) => err ? reject(err) : resolve(reply));
})
.then(reply => {
if (reply === null) return Promise.reject(null);
const imageDetails = JSON.parse(reply);
return imageDetailsCache(imageDetails.allImages);
})
.then(data => ({data}))
.catch(() => Promise.reject({data:{}}));
}