无法在Node / Javascript中链接HTTP请求

我正在尝试重新创build一个我在Node / js中编写的Python脚本,而且我无法用asynchronous/callback的方式来包装我的头。

该脚本相当简单,并使用两个基本的HTTP请求到eBay的API。 第一个请求获取结果项目ID的列表,然后第二个请求获取每个项目的具体信息(描述/列表信息等)。 在Python中,这非常简单,我使用了一个简单的循环。 这不是很快,但它的工作。

然而,在JavaScript中,我正在努力获得相同的function。 我现在的代码如下:

var ebay = require('ebay-api'); var params ={}; params.keywords = ["pS4"]; var pages = 2; var perPage = 2; ebay.paginateGetRequest({ serviceName: 'FindingService', opType: 'findItemsAdvanced', appId: '', params: params, pages: pages, perPage: perPage, parser: ebay.parseItemsFromResponse }, function allItemsCallback(error,items){ if(error) throw error; console.log('FOUND', items.length, 'items from', pages, 'pages'); for (var i=0; i<items.length; i++){ getSingle(items[i].itemId); } } ); function getSingle(id){ console.log("hello"); ebay.ebayApiGetRequest({ 'serviceName': 'Shopping', 'opType': 'GetSingleItem', 'appId': '', params: { 'ItemId': id , 'includeSelector': 'Description' } }, function(error, data) { if (error) throw error; console.dir(data); //single item data I want } ); } 

这是很多人的尝试,但我收到“可能的EventEmitter内存泄漏检测”的警告,并最终打破了“错误:错误的答案”代码undefined errorMessage?null“。 我相当肯定,这只是适当使用callback,但我不确定如何正确地去做。 任何答案或帮助将不胜感激。 我很抱歉,如果这不是一个好问题,如果是这样,请让我知道如何正确地去询问。

Node.js的asynchronous事件链是基于callback的。 而不是:

 getSingle(items[i].itemId); 

您需要将callback函数写入该父函数完成后执行的函数中:

 getSingle(items[i].itemId, function(err, data) { // now you can access the data }); 

而且因为ebay.ebayApiGetRequest是一个冗长的函数,所以在完成之后必须调用告诉它的父函数完成的callback,如下所示:

 ebay.ebayApiGetRequest({ // }, function(error, data) { callback(error, data); } ); 

但是,当然,如果父函数getSingle不支持callback,那么它不会去任何地方。 所以你也需要支持一个callback参数。 这是完整的脚本,使用事件驱动的callback模型进行重写:

 var ebay = require('ebay-api'); var async = require('async'); var params = {}; params.keywords = ["pS4"]; var pages = 2; var perPage = 2; ebay.paginateGetRequest({ serviceName: 'FindingService', opType: 'findItemsAdvanced', appId: '', params: params, pages: pages, perPage: perPage, parser: ebay.parseItemsFromResponse }, function allItemsCallback(error, items) { if (error) throw error; console.log('FOUND', items.length, 'items from', pages, 'pages'); async.each(items, function(item, callback) { getSingle(item.itemId, function(err, data) { callback(err, data); }); }, function(err, results) { // now results is an array of all the data objects }); } ); function getSingle(id, callback) { console.log("hello"); ebay.ebayApiGetRequest({ 'serviceName': 'Shopping', 'opType': 'GetSingleItem', 'appId': '', params: { 'ItemId': id, 'includeSelector': 'Description' } }, function(error, data) { if (error) throw error; console.dir(data); //single item data I want callback(error, data); } ); }