如何使用node-apac链接多个分页请求?

时间:2016-06-04 23:05:49

标签: javascript node.js es6-promise amazon-product-api

我是Javascript和Nodejs的新手,我正在尝试设置一个服务器,它可以通过node-apac节点包从amazon-product-api请求多个ItemPages。到目前为止,我的http服务器启动并运行,并定义了一些路由。我也可以请求一个ItemPage。但我无法链接请求。

查询示例:

var query = {
    Title: theTitle,
    SearchIndex: 'Books',
    BrowseNodeId: '698198',
    Power: 'binding:not (Kindle or Kalender)',
    Sort: '-publication_date',
    ResponseGroup: 'ItemAttributes,Images',
    ItemPage: 1
};

代码:

AmazonWrapper.prototype.getAllPagesForQuery = function(theMethod, theQuery, theResultCallback) {    
    client.execute(theMethod, theQuery).then(function(theResult) {
        var pageCount = theResult.result.ItemSearchResponse.Items.TotalPages;
        var requests = [];
        for(var i = 2; i < pageCount; i++) {
            theQuery.ItemPage = i;
            requests.push(client.execute(theMethod, theQuery));     
        }
        Promise.all(requests).then(function(theResults) {       
            var data = theResults[0];
            for(var i = 1; i < theResults.length; i++) {
                var items = theResults[i].result.ItemSearchResponse.Items.Item;
                data.result.ItemSearchResponse.Items.Item.concat(items);
            }
            theResultCallback(data);
        });
    });
};

如您所见,我想从第一个请求中读取有多少Itempages可用于我的ItemSearch,并为每个Itempage创建一个新请求。不幸的是Promise.all(...)。then()永远不会被调用。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

theQuery看起来像一个对象。因此,当您执行theQuery.ItemPage = i时,它会通过指针传递,然后传递theQuery,您将同一个对象传递给每个请求,并覆盖该ItemPage属性一个对象。这不太可能正常工作。

我不确切知道theQuery是什么,但您可能需要复制它。

此外,您也可以从.getAllPagesForQuery()返回承诺,而不是使用回调,因为您已经在使用承诺。通过承诺,错误处理和链接变得更容易。

您没有完全披露足够的代码,但以下是如何修复的一般想法:

AmazonWrapper.prototype.getAllPagesForQuery = function(theMethod, theQuery) {    
    return client.execute(theMethod, theQuery).then(function(theResult) {
        var pageCount = theResult.result.ItemSearchResponse.Items.TotalPages;
        var requests = [];
        for(var i = 2; i < pageCount; i++) {
            // make unique copy of theQuery object
            var newQuery = Object.assign({}, theQuery);
            newQuery.ItemPage = i;
            requests.push(client.execute(theMethod, newQuery));     
        }
        return Promise.all(requests).then(function(theResults) {       
            var data = theResults[0];
            for(var i = 1; i < theResults.length; i++) {
                var items = theResults[i].result.ItemSearchResponse.Items.Item;
                 data.result.ItemSearchResponse.Items.Item = data.result.ItemSearchResponse.Items.Item.concat(items);
            }
            return data;
        });
    });
};

// Usage example:
obj.getAllPagesForQuery(...).then(function(data) {
    // process returned data here
});