我正在尝试将我的Express 4应用程序转换为Koa,一切都很顺利,但Koa使用了ES7和ES6之类的一些新东西(有些东西甚至没有最终确定)。
我从Express 4应用程序获得了这个代码,它基本上查找了飘带并将它们列在主页上,这里是Express 4,Async回调样式函数:
let streams = [];
let results = [];
models.User.findAll({
attributes: ["twitch_link"],
where: { twitch_link: { $ne: "" } }
})
.then((links) => {
for (let i = 0; i < links.length; i++) {
let index = links[i].twitch_link.lastIndexOf("/");
streams.push(links[i].twitch_link.substring(index+1));
}
async.each(streams, (stream, cb) => {
client.streams({ channel: stream }, (err, response) => {
response.username = stream;
results.push(response);
cb();
});
}, (err) => {
if (err) {
console.warn(err);
return;
}
return res.json({success: true, streams: results});
});
});
});
很好,它循环在数据库中注册的流,循环遍历它们以获取字符串的结尾(也就是流用户名),然后执行async.each循环以并行查找每个流,然后将数据推送到数组,然后完成所有操作后,将流数据发送到客户端。这一切都很好,花花公子。
现在尝试在Koa中重新创建这个,使用下一代产品,我想知道我是否有正确的想法,或者我做错了什么,或者以某种方式使用它们并不意味着使用过,这是Koa版本:
ctx.type = 'json';
try {
let streams = [];
let links = await models.User.findAll({
attributes: ["twitch_link"],
where: {
twitch_link: {
$ne: ""
}
}
});
for (let i = 0; i < links.length; i++) {
let index = links[i].twitch_link.lastIndexOf("/");
streams.push(links[i].twitch_link.substring(index + 1));
}
let fetchStream = (streamName) => {
return new Promise((res, rej) => {
client.streams({
channel: streamName
}, (err, response) => {
if (err) {
rej(err);
}
response.username = streamName;
res(response);
});
});
}
let promiseArray = [];
for (let i = 0; i < streams.length; i++) {
promiseArray.push(fetchStream(streams[i]));
}
let results = await Promise.all(promiseArray);
ctx.body = {
success: true,
streams: results
}
} catch (err) {
console.log(err);
ctx.status = 200;
ctx.body = {
success: false,
error: 'Internal server Error'
};
}
在Koa版本中,我基本上做了同样的事情,但我没有使用async.each
,而是使用Promise.all
,而不是使用async callbacks
我将node-twitchapi callback
包裹起来一个承诺。然后,我将每个承诺推送到一个数组,然后我调用Promise.all
等待每个并行承诺完成,完成后,同样的事情只是发送给客户端。
我想要澄清是否正在接近将旧的异步回调转换为下一代承诺/ async / await。任何有关我做错或对错的信息都会很棒。感谢。