节点异步/等待问题

时间:2020-03-14 03:49:34

标签: node.js express async-await

所以我将slackbot从python移植到Node上,并且出现异步/等待问题。 我的功能完全忽略了await关键字,而linter给了我以下错误:

“等待”对此表达式的类型没有影响。

代码如下:

function list_channels(access_token) {
  fetch(`https://slack.com/api/channels.list?token=${access_token}`)
    .then((r) => {
      r.json()
      .then(c => {
        let channels = {}
        for (channel of c.channels) {
          channels[channel.name] = channel.id
        }
        return new Promise(resolve => {
          console.log("_______resolve", channels)
          resolve(channels)
        })
      })
    })

}

const wrapper = {
  list_channels: list_channels
}
module.exports = wrapper

  app.get('/admin', async (req, res) => {
    const user = req.user
    let a = await wrapper.list_channels(code)
    res.send({hmm:a})
  })

呼叫路线时,我得到{}

1 个答案:

答案 0 :(得分:0)

我重写了保留变量/函数名称的代码(尽管您应该使用更好的名称)

async function list_channels(access_token) {
    let r = await fetch(`https://slack.com/api/channels.list?token=${access_token}`);
    let c = await r.json();
    let channels = {}
    for (channel of c.channels) {
        channels[channel.name] = channel.id;
    }
    console.log("_______resolve", channels);
    return channels;
}

module.exports = {list_channels} // Object with property list_channels

如您所见,可以使用await代替.then。这样,您将避免回调地狱问题,从而使代码更易读和易于编辑。

这里有一个很好的解释:http://callbackhell.com/


如果您真的想使用回调地狱方式,则可以执行以下操作:

function list_channels(access_token) {
    return new Promise(resolve => {
        fetch(`https://slack.com/api/channels.list?token=${access_token}`).then((r) => {
            r.json().then(c => {
                let channels = {}
                for (channel of c.channels) {
                    channels[channel.name] = channel.id
                }
                console.log("_______resolve", channels)
                resolve(channels)
            })
        })
    })   
}