将异步回调转换为异步/等待承诺的正确方法是什么?

时间:2016-01-28 06:57:04

标签: javascript node.js asynchronous

我正在尝试将我的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。任何有关我做错或对错的信息都会很棒。感谢。

0 个答案:

没有答案