【问题标题】:Promises in node.jsnode.js 中的承诺
【发布时间】:2018-07-05 14:04:27
【问题描述】:

旨在获取在消息历史记录中找到的用户的图片网址。 显然,在我遍历 data.directMessages.map 对象图像 url 值之后,它永远不会到达 res.render('index', {data}) 我确信我需要data.directMessages.map 首先执行所有操作,然后才返回结果。你可以帮帮我吗 弄清楚如何?

这是我的伪代码:

app.get('/', (req, res) => {
   Promise.all(arrayOfPromises).
   then(data => {
       return {
           ...
           ...
           directMessages: ...
       }
   }).
   // HELP NEEDED HERE !!!
   then(data => {
       data.directMessages.map(info => {
           const getData = await getProfileDataById(info);
            info.profile_img_url = await getData.profile_img_url;
           });
           return data;
       // HELP END !!!
       }).then(data => {
           res.render('index', {data});
       })
    })

我正在考虑这样做

const results = data.DirectMessages.map(async (info)=> {
    // do stuff and return results
});
Promise.all(results).then(data => data);

这是解决问题的正确方法吗?

【问题讨论】:

  • map(async info =>? awaitasync 函数之外很糟糕,我相信。
  • 另外,不要忘记map 返回修改后的数组,并且它不会就地修改它。如果你想用map函数修改data,只需按照data.directMessages = data.directMessages.map(...的方式进行即可。
  • const getData = await getProfileDataById(id);iddata.directMessages 的一部分?还是所有data.directMessages都一样?
  • @karthik 哦,是的。我应该用信息替换 id。
  • 我还想检查getProfileDataById(info) & getData.profile_img_url 是否返回承诺

标签: javascript node.js promise es6-promise


【解决方案1】:

你可以使用async/await如下方式(假设getProfileDataById(info)会返回promise)

app.get('/', async (req, res) => {
    let data = await Promise.all(arrayOfPromises);
    data = {
        ...
        ...
        directMessages: ...
    };
    // Promise.all help you run parallel execution  
    const getData = await Promise.all(data.directMessages.map(info => getProfileDataById(info)));
    getData.forEach((profileData, i) => {
        data.directMessages[i].profile_img_url = profileData.profile_img_url;
    })
    res.render('index', {
        data
    });
})

【讨论】:

  • 太棒了!这就是我一直在寻找的逻辑!!!无法弄清楚 await 仅在承诺之前使用。现在越来越清楚了。
猜你喜欢
  • 2018-06-08
  • 2018-04-05
  • 2017-05-17
  • 2015-04-15
  • 2016-05-12
  • 1970-01-01
  • 2014-07-04
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多