NodeJS - Promise.all () с обещанием массива не возвращается должным образом - PullRequest
1 голос
/ 15 марта 2019

Я занимаюсь разработкой приложения nodeJS, и у меня есть следующий код:

let all_result = await Promise.all([list_agrees,list_disagrees]);
    list_agrees = await Promise.all(list_agrees);
    list_disagrees = await Promise.all(list_disagrees);        

res.json({
    result_1:all_result,
    result_2: {
        list_agrees,
        list_disagrees
    }
});

Привет, вот из чего пришли list_agrees и list_disagreesUserHelper.getUserBasicInfor() возвращает обещание)

list_agrees = list_agrees.map(async function(id_user){ 
  return await UserHelper.getUserBasicInfor(req,id_user);
}); 

list_disagrees = list_disagrees.map(async function(id_user){ 
  return await UserHelper.getUserBasicInfor(req,id_user); 
});

теперь, когда я получил ответ, я получил

{
    "result_1": [
        [
            {}
        ],
        [
            {}
        ]
    ],
    "result_2": {
        "list_agrees": [
            {
                "avatar_thumbnail": null,
                "full_name": "Đạt Tô",
                "nick_name": "Gầy lọ"
            }
        ],
        "list_disagrees": [
            {
                "avatar_thumbnail": null,
                "full_name": "Gola User ",
                "nick_name": null
            }
        ]
    }
}

Я не знаю, почему Promise.all([list_agrees,list_disagress]) не вернул результат, как я ожидал!

1 Ответ

2 голосов
/ 15 марта 2019

Promise.all() работает над повторяемой коллекцией обещаний.

Ваша проблема в том, что и list_agrees, и list_disagrees являются массивами обещаний, а не самих обещаний.

Я бы порекомендовал что-то подобное (без перезаписи исходных массивов)

const agrees = Promise.all(list_agrees.map(id_user =>
    UserHelper.getUserBasicInfor(req, id_user)))
const disagrees = Promise.all(list_disagrees.map(id_user =>
    UserHelper.getUserBasicInfor(req, id_user)))

Теперь agrees и disagrees - это каждое обещание, которое разрешается при разрешении каждого вызова UserHelper.getUserBasicInfor().

Нет необходимости использовать асинхронные функции в отображении, так как ваш UserHelper.getUserBasicInfor() все равно возвращает обещание.

Теперь вы можете использовать

const all_result = await Promise.all([agrees, disagrees])
const [agrees_result, disagrees_result] = all_result
res.json({
  result_1:all_result,
  result_2: {
    list_agrees: agrees_result,
    list_disagrees: disagrees_result
  }
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...