Node.jscallback混淆

我正在尝试使用nowjs在nodejs应用程序上实现一个自动完成器。

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(响应)表示响应未定义。 我是新来的节点,所以答案可能很简单,但仍然无法弄清楚。

您将asynchronous调用视为同步。 你的getAutocomplete需要一个callback函数来获取响应。 你已经使用了很多,在你的request调用和你的parseString调用。

喜欢这个:

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

而不是return

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