【问题标题】:Trouble chaining HTTP requests in Node/Javascript在 Node/Javascript 中链接 HTTP 请求时遇到问题
【发布时间】:2015-11-13 05:19:27
【问题描述】:

我正在尝试重新创建我在 Node/js 中编写的 Python 脚本,但我无法完全理解异步/回调方式。

脚本相当简单,使用两个基本的 HTTP 请求到 eBay 的 API。第一个请求获取生成的项目 ID 列表,然后第二个请求获取每个项目的特定信息(描述/列表信息等)。在 Python 中,这相当简单,我使用了一个简单的循环。无论如何,它并不快,但它确实有效。

然而,在 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 内存泄漏”警告,它最终以“错误:错误的“确认”代码未定义的错误消息?null”而中断。我相当确定这只是与正确使用回调有关,但我不确定如何正确处理它。任何答案或帮助将不胜感激。如果这不是一个好问题,我深表歉意,如果是,请告诉我如何正确提问。

【问题讨论】:

  • 看看使用类似node-async 的东西来执行此操作 - 它可以为您处理循环并管理完成回调。
  • 我的理解是请求将被处理 -> 生成响应 -> 回调被调用 -> 为每个项目处理 2ndRequest。这不是一般的数据流吗?
  • 不。写一个描述它的答案。
  • welp.. 抱歉,我是一名实习生,想尽可能多地学习,而且我对 Web 开发不熟悉哈哈

标签: javascript node.js http asynchronous callback


【解决方案1】:

Node.js 的异步事件链建立在回调之上。而不是:

getSingle(items[i].itemId);

您需要在该函数中编写一个回调,该回调会在父函数完成后执行:

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

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

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

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

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

【讨论】:

  • 这很有帮助,感谢您的清晰解释。我为我的无知道歉,node 的世界对我来说是一个全新的野兽。
  • 哈哈!不用担心,你的头会很多;)
  • 我仍处于“实习生意识到有多少大学没有教书”阶段,但我感谢您的帮助!
  • 老实说,科技领域的变化速度快于学院/大学跟不上的速度!
  • 我觉得学位真的只是帮助人们更好地理解谷歌搜索结果:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-04
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
相关资源
最近更新 更多