2016-12-23 25 views
1

continue connloop;スローSyntax Error: Unsyntactic continueラベル付きcontinue文。 forループ

私はcontinue;からcontinue connloop;を変更すると、それが実行されます(しかし、ofcourseのそれは外側のループではなく、内側1に実行されません)

なぜこの出来事が、これは非推奨またはnodejsで違法されている/ ecma6?

ラベルの代わりに関数呼び出しを使用することはお勧めしません。

redisSubscriber.on("message", function(channel, event){ 

event = JSON.parse(event); 
const eventPayload = JSON.stringify(event.payload); 

connloop: 
    for(let conn in connections){ 
    conn = connections[conn]; 
    redisClient.SMEMBERS('connection/'+conn.id+'/subscriptions', (err, subscriptions)=>{ 

     let intersectedTags = []; 
     if(event.address.tags.length > 0 && subscriptions.length > 0){   
     for(let tag in subscriptions){ 
      tag = subscriptions[tag]; 

      for(let _tag in event.address.tags){ 
      _tag = event.address.tags[_tag]; 
      if(tag == _tag) 
       intersectedTags.push(tag); 

      } 
     } 
     } 

     let exclusive = false; 
     for(let userId in event.address.include){ 
     userId = event.address.include[userId]; 
     if(userId == conn.userId){ 
      exclusive = true; 
      break; 
     } 
     } 

     if(intersectedTags.length > 0 || exclusive){ 
     if(event.address.exclude){ 
      for(let exclude in event.address.exclude){ 
      exclude = event.address.exclude[exclude]; 
      if(exclude == conn.userId){ 
       continue connloop; 
      } 
      } 
     } 
     const browserEvent = {tags: intersectedTags, notification: eventPayload, exclusive}; 
     conn.write(JSON.stringify(browserEvent)); 
     } 
    }) 
} }); 

答えて

1

閉鎖機能のうち、ラベルを継続使用しているためとの差範囲を、unsyntacticでは、文とラベルconnloopを続ける:

// continue statement in anonymous function 
redisClient.SMEMBERS('connection/'+conn.id+'/subscriptions', (err, subscriptions)=>{ 

次のコードは、同じスコープとOKする必要があります:

redisSubscriber.on("message", function(channel, event){ 

connloop: 
    for(let conn in connections){ 
     // more codes ... 
     for(let exclude in event.address.exclude){ 
      exclude = event.address.exclude[exclude]; 
      if(exclude == conn.userId){ 
       continue connloop; 
      } 
     } 
    } 
}); 
2

は、関数境界を超えては無効です。関数の外にある位置にジャンプしようとすると、関数内にcontinueが置かれます。

redisClient.SMEMBERSはおそらく非同期操作なので、continueがあると意味がありません。そのため、ループはコールバックが呼び出された時点で既に終了しています。

関連する問題