所以我将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})
})
呼叫路线时,我得到{}
答案 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)
})
})
})
}