Узел Asyn c / Ожидание выпуска - PullRequest
0 голосов
/ 14 марта 2020

Итак, я переношу своего слэкбота с python на Node и у меня возникли проблемы с async / await. Моя функция полностью игнорирует ключевое слово await, и линтер дает мне следующую ошибку:

'await' не влияет на тип этого выражения.

Вот код:

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 голосов
/ 14 марта 2020

Я переписал ваш код, сохранив имена переменных / функций (хотя вы должны использовать более подходящие имена)

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. Таким образом, вы избежите проблемы callback hell , что сделает ваш код более читабельным и легко редактируемым.

Здесь есть хорошее объяснение: http://callbackhell.com/


Если вы действительно хотите go на обратном вызове в ад , вы можете сделать что-то вроде:

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)
            })
        })
    })   
}
...