Попытка выяснить, как go вокруг Promise: ожидающая ситуация - PullRequest
1 голос
/ 18 февраля 2020

Я не смог найти правильный способ заставить работать мой обработчик GET. В приведенном ниже коде, когда я отправляю GET-запрос к этой конечной точке, все элементы моего массива отображаются как «Promise: Pending». Можете ли вы предложить способ обойти это? Я пытался использовать метод setTimeout (), но мне кажется, что это неправильное решение.

Заранее спасибо.

apiRouter.get('/photos', (req,res,next) => {
    axios.get("https://graph.instagram.com/me/media?fields=id,caption&access_token={some_access_token}")
    .then(response => {
        const photosArr = response.data.data;
        const arr = photosArr.map(id => {
            return axios.get(`https://graph.instagram.com/${id.id}?fields=id,media_type,media_url,username,timestamp&access_token={some_acces_token}`)
            .then(response => {
                 return response.data.media_url;
            })
        })
        res.send(arr);
        next();
    })
})

Ответы [ 2 ]

2 голосов
/ 18 февраля 2020

Это было бы полезно использовать async / await

Проблема в том, что вы возвращаете обещание в вашем Array.map(). Даже если у вас есть блок .then после вашего обещания, само обещание - это то, что возвращается, потому что оно выполняется асинхронно.

Примерно так должно быть близко

apiRouter.get('/photos', async (req,res,next) => {
    const response = await axios.get("https://graph.instagram.com/me/media?fields=id,caption&access_token={some_access_token}")
    const photosArr = response.data.data;
    const arr = photosArr.map(async (id) => {
        const resp await axios.get(`https://graph.instagram.com/${id.id}?fields=id,media_type,media_url,username,timestamp&access_token={some_acces_token}`)
         return resp.data.media_url;
    };
    const final = await Promise.all(arr);
    res.send(final);
    next();
})
0 голосов
/ 18 февраля 2020

Вы можете использовать Promise.all(), чтобы дождаться разрешения всех обещаний в массиве:

apiRouter.get('/photos', (req,res,next) => {
    axios.get("https://graph.instagram.com/me/media?fields=id,caption&access_token={some_access_token}")
    .then(response => {
        const photosArr = response.data.data;
        Promise.all(photosArr.map(id => {
            return axios.get(`https://graph.instagram.com/${id.id}?fields=id,media_type,media_url,username,timestamp&access_token={some_acces_token}`)
            .then(response => {
                 return response.data.media_url;
            })
        })).then(photos => {
          res.send(photos);
          next();
        })
    })
})```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...