【问题标题】:Trying to figure out how to go around Promise: Pending situation试图弄清楚如何绕过 Promise:未决情况
【发布时间】:2020-06-02 20:22:58
【问题描述】:

我找不到让我的 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();
    })
})

【问题讨论】:

    标签: javascript node.js express promise


    【解决方案1】:

    这将是使用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();
    })
    

    【讨论】:

    • 异步函数返回承诺。那么,在映射到photosArr 之后,您是否仍然有一系列未解决的承诺要随您的解决方案一起发回?
    • 好收获。谢谢。
    【解决方案2】:

    您可以使用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();
            })
        })
    })```
    

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-27
      • 2020-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多