首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Node/Javascript中链接HTTP请求的故障

在Node/Javascript中链接HTTP请求的故障
EN

Stack Overflow用户
提问于 2015-08-19 18:53:46
回答 1查看 565关注 0票数 1

我正在尝试重新创建我用Node/js编写的Python脚本,而且我很难用异步/回调的方式来处理它。

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

然而,在javascript中,我很难获得相同的功能。我现在的代码如下:

代码语言:javascript
运行
复制
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内存泄漏”警告,并最终破坏了“错误:错误的'ack‘代码未定义的errorMessage? null”。我很确定这与正确使用回调有关,但我不知道如何正确地进行。如有任何答案或帮助,将不胜感激。如果这不是一个好问题,我很抱歉,如果是这样的话,请让我知道如何正确地去问。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 19:03:42

. is的异步事件链构建在回调上。而不是:

代码语言:javascript
运行
复制
getSingle(items[i].itemId);

在父函数完成后,需要将回调写入执行的函数中:

代码语言:javascript
运行
复制
getSingle(items[i].itemId, function(err, data) {
     // now you can access the data   
});

因为ebay.ebayApiGetRequest是一个很长的函数,所以必须在它完成之后调用它的父函数的回调,如下所示:

代码语言:javascript
运行
复制
ebay.ebayApiGetRequest({
        //
    },
    function(error, data) {
        callback(error, data);
    }
);

但是当然,如果父函数getSingle不支持回调,那么它就不会去任何地方。因此,您还需要在那里支持回调param。下面是使用事件驱动回调模型重写的完整脚本:

代码语言:javascript
运行
复制
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);
        }
    );
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32103443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档