2016-08-23 3 views
0

모든 이벤트를 듣고 루프를 만들었습니다. 문제는 내가 페이지를 열 때 그들 모두의 수업이 "white-text"라는 것입니다. 그러나 데이터가 show_inventory에서 오는 경우 클래스는 "magenta-text"여야합니다.Socket.IO 외부 배열에 액세스 할 수 없습니다.

작은 영어로 죄송합니다.

var events = { 
    log_stats:       'magenta', 
    show_inventory:     'magenta', 
    arrived_at_cluster:    'white', 
    arrived_at_fort:     'white', 
    softban_log:      'magenta', 
    softban_fix_done:     'white', 
    used_lucky_egg:     'white' 
} 

socket_io = io.connect('127.0.0.1:4000'); 
for (var k in events){  
    if (events.hasOwnProperty(k)) { 
     socket_io.on(k+':user', function (data) { 
      mapView.log({ 
       message: "<p class='" + events[k] + "-text" + "'>" + data['data']['msg'] + "</p>", 
       color: events[k] + "-text" 
      }); 

     }); 
    } 
} 
+0

mapView.log는()는 컴파일되고, 변수 k는 어레이 흰 색의 마지막 반복에 덮어 쓰기되어, 실행 시간에 의해, 동기 기능없는 경우 변경하여 확인할 수있다 배열 내의 마젠타에 대한 마지막 키의 값. 그러면 모든 텍스트가 마젠타 색으로 바뀝니다. 이 문제를 해결하려면 핸들러 함수를 작성하거나 간단한 setTimeout이 작업을 수행 할 수 있습니다. setTimeout (function (j) {/ ** 맵 로그 일 * /}, 100, k); '' '쓰고 있습니다. 오전 1시 38 분에 모바일에서 실행되므로 100 %로 생각하지 마십시오. 직접 응답을 기다리거나 다른 키워드로 문제를 계속 검색하십시오. – Robinlemon

+0

이것은 'for' 루프 내부의 이벤트 핸들러와 같은 비동기 코드의 일반적인 문제입니다. 변수'k'는'.on()'이벤트가 실제로 발생했을 때 나중에 시간이되기를 원하지 않을 것입니다. 클로저 (closure)를 사용하고, '블록 (block) 범위 변수'를 얻도록 'let'으로 전환 할 수 있습니다. 동일한 문제를 논의하는 중복 질문이 수백 가지 있습니다. – jfriend00

+0

나는 거기에 있지만 검색하는 방법을 모르겠지만 .. 그것은 비동기 코드에 관한 것입니다. 검색을 만들어 보겠습니다 –

답변

0

나는 내 문제를 파악했습니다. @ jfriend00은 약 let에 대해 언급했습니다. 나는 조금 탐색하고 사용법을 이해한다. 당신은 코드를 찾을 수 있습니다. 추가 된 행 : let color = events[k];

고마워요.

for (var k in events){  
    if (events.hasOwnProperty(k)) { 
     let color = events[k]; 
     socket_io.on(k+':oralunal', function (data) { 
       kayit({ 
        message: "<p class='" + color + "-text" + "'>" + data['data']['msg'] + "</p>", 
        color: color + "-text" 
       }); 
       console.log(renk); 
     }); 
    } 
} 
관련 문제