NodeJS - Promise возвращает неопределенный объект в пуле redis - PullRequest
0 голосов
/ 24 октября 2018

У меня есть объект пула Redis, созданный из redis-connection-pool.Ищет ключ для получения массива всех идентификаторов изображения.Затем для каждого элемента ищется другой ключ Redis, так что значения добавляются в один объект JSON.Этот объект возвращается в ответ на запрос GET.

По какой-то странной причине (возможно, ошибка Redis?), Хотя Обещание разрешается с правильными данными, функция, использующая это Обещание, всегда видит 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)
        })
    })
}

1 Ответ

0 голосов
/ 24 октября 2018

в своих попытках вы используете

await configPool.get('allImages', async (err, reply) => {

во-первых, .get не возвращает обещание, поэтому await в этом нет смысла
во-вторых, вы не используете ожидание внутриобратный вызов, поэтому нет необходимости делать это async

Кажется, ваш код может быть упрощен

Во-первых, поскольку вы хотите вернуть обещание, оберните configPool.get в обещание, которое будетбыть решена / отклонена в обратном вызове

после этого, это просто вопрос цепочки обещаний, так как ваш код подразумевает, что 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:{}}));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...