在javascript

时间:2017-09-24 17:06:56

标签: javascript node.js for-loop asynchronous instagram

写一个像Instagram一样的小Instagram。

它是如何工作的,我有一个对象,它是来自聊天的用户列表及其Instagram用户名。

所以我在这里有一小段代码,它遍历列表,获取每个用户名的最新媒体帖子,并继续检查,所有这些都在循环中。然而,我面临的问题是循环内部存在异步调用,并且循环保持迭代,但异步调用的结果稍后会出现。但是,这不是我想要的操作方式。有人能告诉我如何克服这一点,或者以异步方式做到这一点的正确方法吗?谢谢 下面是我的代码,还有一个注释,显示列表对象的格式,以防万一有人想知道。感谢

bot.on('/check', (msg) => {
    list['12345'] = {username:'someguy', list:['@the.haider.ali']};
    list['45678'] = {username:'someguy2', list:['@vishnuvayala']};
    if(list.length != 0){
        for(i in list){
            var list2 = JSON.parse(JSON.stringify(list));
            delete list2[i];
            for(x in list2){
                for(y in list2[x].list){
                    let checkis = list2[x].list[y]
                    console.log("Checking "+checkis);
                    getInstaID(checkis).then(function(userid){
                        return getMediaID(userid);
                    }).then(function(mediaid){
                        return getLikers(mediaid);
                    }).then(function(likers){
                        console.log("Last liker is "+likers[0].username);
                    });
                    console.log("Done checking "+checkis);
                }
            }
        }
    }
});

这是我得到的输出

Checking @the.haider.ali
Done checking @the.haider.ali
Checking @vishnuvayala
Done checking @vishnuvayala
Last liker is ghetto._boy
Last liker is dk.gayathri

1 个答案:

答案 0 :(得分:1)

尝试使用异步等待。 await函数可以被await / promise阻塞,可以阻止数组迭代直到等待响应。

不要害怕等待表达。它只是阻止功能,直到同样众所周知的Promise将无法解决。

请检查它是否有效。

bot.on('/check', async function(msg){
    list['12345'] = {username:'someguy', list:['@the.haider.ali']};
    list['45678'] = {username:'someguy2', list:['@vishnuvayala']};
    if(list.length != 0){
        for(i in list){
            var list2 = JSON.parse(JSON.stringify(list));
            delete list2[i];
            for(x in list2){
                for(y in list2[x].list){
                    let checkis = list2[x].list[y]
                    console.log("Checking "+checkis);
                    var userid = await getInstaID(checkis);
                    var mediaid = await getMediaID(userid);
                    var likers = await getLikers(mediaid);
                    console.log("Last liker is "+likers[0].username);
                    console.log("Done checking "+checkis);
                }
            }
        }
    }
});

输出应该像

Checking 0
Last liker is likers: 0
Done checking 0
Checking 1
Last liker is likers: 1
Done checking 1
Checking 2
Last liker is likers: 2
Done checking 2