2012-01-02 25 views
1

nowjsを使ってnodejsアプリケーションでオートコンプリートを実装しようとしています。Node.jsコールバック混乱

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

た呼び出します。

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(応答)、応答が未定義であることを述べています。私はノードに新しいので、答えはおそらく単純ですが、それでもそれを把握することはできません。

+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); 
    // ... 
}