2012-01-02 140 views
1

我想在nodejs應用上使用nowjs實現一個自動完成器。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瞭解如何尋求未來的問題的問題。這將節省我們的時間。 – 2012-01-02 18:29:56

回答

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