2012-01-02 3 views
1

nowjs를 사용하는 nodejs 앱에 자동 완성 기능을 구현하려고합니다.Node.js 콜백 혼동

function getAutocomplete(search) { 
    console.log(search); 
    var artist = new Array(); 

    request({uri: 'http://musicbrainz.org/ws/2/artist/?query=' + search + '&limit=4', headers: "Musicbrainz Application Version 1"}, function(error, response, body) { 
     par.parseString(body, function(err, result) { 
      var count = result['artist-list']['@']['count']; 

      var artists = result['artist-list']['artist']; 
      // var artist = new Array(); 

      if (count > 1) { 
      artists.forEach(function(a) { 
       var att = a['@']; 
       var id = att['id']; 
       var name = a['name']; 
       var dis = a['disambiguation']; 

       if (dis) { 
        var display = name + " (" + dis + ")"; 
       } else { 
        display = name; 
       } 
       artist.push({'id':id, 'name': name, 'disambiguation':dis, 
            'label':display, 'value':name, 'category':"Artists"}); 
      }); 
      //everyone.now.receiveResponse(artist); 
      console.log("artist"); 
      console.log(artist); 
      return artist; 
     } else { 
      console.log(artists); 
      var att = artists['@']; 
      var id = att['id']; 
      var name = artists['name']; 
      var dis = artists['disambiguation']; 
      var resp = [{'id':id, 'name': name, 'disambiguation':dis, 
           'label':name, 'value':name, 'category':"Artists"}]; 
      return resp; 
      // everyone.now.receiveResponse([{'id':id, 'name': name, 'disambiguation':dis, 
      //      'label':name, 'value':name, 'category':"Artists"}]); 
     } 

     }); 
    }); 
} 

그러나,을 console.log (응답) 응답이 정의되지 않은 것을 말한다 호출

everyone.now.sendAutocomplete = function(search) { 
    var response = getAutocomplete(search); 
    console.log("response"); 
    console.log(response); 
}; 

. 나는 노드에 익숙하지 않아서 대답은 간단하지만 여전히 그것을 파악할 수는 없다.

+0

http://stackoverflow.com/tags/node.js/info 미래 문제에 대한 질문을하는 방법을 참조하십시오. 그것은 우리 시간을 절약 할 것입니다. –

답변

6

비동기 호출을 동기식으로 처리하고 있습니다. getAutocomplete는 응답을 얻기 위해 콜백 함수를 사용해야합니다. request 전화와 parseString 전화에서 이미 많은 것을 사용하고 있습니다. 이처럼

:

everyone.now.sendAutocomplete = function(search) { 
    getAutocomplete(search, function (response) { 
     console.log("response"); 
     console.log(response); 
    }); 
}; 

대신 return의 :

function getAutocomplete(search, callback) { 
    // ... 
    callback(result); 
    // ... 
}