【问题标题】:Javascript Loop Not Finished before If Statement RunsJavascript 循环在 If 语句运行之前未完成
【发布时间】:2018-06-12 21:52:01
【问题描述】:

我已经被这个问题困扰了一段时间了。我正在调用一个 API - 得到的结果就好了。我将值保存到数组中。我遇到的问题是尝试从数组中获取特定值。我有一个 for in 循环运行需要时间,所以当 if 语句运行时,循环还没有达到那个值。如果我使用 Postman,我会看到该值存在,只是循环没有及时执行。这是我的代码:

     var msg = {};
     var embed = {};
     var link = {};
     var msgIn = [];
     var rel = [];

     return SkypeService.getEvent(msg).then(function (result) {
            msg.eventsNext = result._links.next.href;           
            if (result && result.sender && result.sender.length > 0) {
                if (result.sender) {                                            
                    for (var item in result.sender) {
                        var event = result.sender[item].events;                        
                        for (var key in event) {                                
                            embed = event[key]._embedded;
                            msgIn.push(embed); 
                        }
                        for (var key in event) {
                            link = event[key].link;
                            rel.push(link);
                        }
                        // console.log(Object.entries(msgIn))                          
                        if(rel['rel'] == 'message') {
                            console.log("message is there")
                            if(msgIn.message) {
                                console.log("links exist")
                                if(msgIn.message.direction == "Incoming") {
                                    console.log("direction is there")
                                    msg.participant = msgIn.message._links.participant.href;
                                    msg.contMsg = msgIn.message._links.messaging.href;
                                    msg.msgIn = msgIn.message._links.plainMessage.href;
                                    break;
                                }
                            }
                        }

                        if(rel['rel'] == "messagingInvitation"){
                            console.log("invite there")
                            if(msgIn.messagingInvitation && msgIn.messagingInvitation.state !== "Failed") {
                                console.log("invite link") 
                                if(msgIn.messagingInvitation.direction == "incoming") {
                                    console.log("direction invite")
                                    msg.msgInviteState = msgIn.messagingInvitation._links.state;
                                    msg.acceptInvite = msgIn.messagingInvitation._links['accept'].href;
                                    msg.msgIn = msgIn.messagingInvitation._links.message.href;
                                    break;
                                }                                   
                            }
                        }
                        if(rel['rel'] == 'messaging') {
                            console.log('messaging there')
                            if(msgIn.messaging) {
                                if(msgIn.messaging.state == "Disconnected") {
                                    console.log("msgn Disconnected")
                                    msg.addMsg = msgIn.messaging._links.addMessaging.href;
                                    break;
                                }
                            }
                        }                                               
                    }
                }
            }
            console.log(msg)    
        })

另外,我附上了我的本地主机的屏幕截图,该屏幕打印了显示密钥存在的 msgIn。

当我测试运行sails lift 的代码时,我可以看到msgIn 打印了几次,每次都在增加长度。这就是让我认为 if 语句运行时 for 循环尚未完成的原因。

请帮忙 - 我真的需要解决这个问题。我需要捕获这些链接,以便在下一步中使用它们。

谢谢。

【问题讨论】:

  • 循环后面有 3 个 if 语句,你指的是哪一个?
  • 您需要将其简化为一个更小的示例。只是在这里粘贴一些代码并要求其他人调试它是不太正确的。尝试为您试图了解如何解决的问题制定一个不太具体的示例。
  • 您是否尝试过将 for 语句放在第一个 .then() 块中,然后将 if 语句放在下一个 .then 块中?
  • 对你为什么要在第一个 if 中检查 result.sender 感到困惑,然后在下一行立即再次检查。我会将其重写为嵌套 for...in 循环以外的其他内容。但也许这只是我。
  • @Chibuzo 理想情况下都是 3 个。但是 if(rel['rel'] == 'message') 是最感兴趣的一个。问题是它有时会捕获这些值 - 但即使它存在,也不是一直捕获。

标签: javascript node.js loops sails.js


【解决方案1】:

我已通过更改代码解决了我的问题。这是新版本:

     return 
     SkypeService.getEvent(msg).then(function 
     (result) {
            msg.eventsNext = result._links.next.href;

            if (result.sender) {                                            
                for (var item in result.sender) {
                    var event = result.sender[item].events;                        
                    for (var key in event) {                                
                        embed = event[key]._embedded;
                        link = event[key].link;                          
                    };

                    if(link['rel'] == 'message') {
                        console.log("message is there")
                        if(embed.message) {
                            console.log("links exist")
                            if(embed.message.direction == "Incoming") {
                                console.log("direction is there")
                                msg.participant = embed.message._links.participant.href;
                                msg.contMsg = embed.message._links.messaging.href;
                                msg.msgIn = embed.message._links.plainMessage.href;
                                break;
                            }
                        }
                    };

                    if(link['rel'] == "messagingInvitation"){
                        console.log("invite there")
                        if(embed.messagingInvitation) {
                            console.log("invite link") 
                            if(embed.messagingInvitation.direction == "incoming") {
                                console.log("direction invite")
                                msg.msgInviteState = embed.messagingInvitation._links.state;
                                msg.acceptInvite = embed.messagingInvitation._links['accept'].href;
                                msg.msgIn = embed.messagingInvitation._links.message.href;
                                break;
                            }                                   
                        }
                    };

                    if(link['rel'] == 'messaging') {
                        console.log('messaging there')
                        if(embed.messaging) {
                            if(embed.messaging.state == "Disconnected") {
                                console.log("msgn Disconnected")
                                msg.addMsg = embed.messaging._links.addMessaging.href;
                                break;
                            }
                        }
                    };
                    console.log(msg)                                              
                };                  
            };               
        });

我删除了结果验证并简化了 for (var key in event) 以同时处理这两个操作。另外,我已经删除了将值推入的数组,因为我没有使用它。这可能是导致我无法验证方向的耗时因素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    • 2021-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2022-12-18
    相关资源
    最近更新 更多