2017-09-24 118 views
0

编写一个小的Instagram,如检查机器人。javascript中的异步函数调用for循环

它是如何工作的,我有一个对象,这是一个聊天用户列表和他们的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 
+0

你需要做到这一点在异步方式,你混合同步和异步 –

+0

@RahulSingh是啊,我已经得出这个结论我自己,请你提供一个建设性至少评论? –

+0

你检查我的答案,它适合你吗? – Firanolfind

回答

1

与异步尝试等待。异步函数可以被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 
+0

这也将表现出相同的方式异步等待下引擎承诺,唯一的事情是,控制台日志将是正确的,因为问题有一个控制台日志中的承诺和一个外部 –

+0

这个输出看起来像这样https如预期的那样://notey.it/n/MTJzYg 。 –

+0

你检查了吗? https://jsbin.com/nonavojowu/edit?js,console – Firanolfind