2016-06-04 29 views
0

Ich bin neu in Javascript und Nodejs und ich versuche, einen Server einzurichten, der mehrere ItemPages von Amazon-Produkt-API über das node-apac Knotenpaket anfordern kann. Bis jetzt ist mein HTTP-Server in Betrieb und es sind einige Routen definiert. Ich kann auch eine einzelne ItemPage anfordern. Aber ich habe Schwierigkeiten, die Anfragen zu verketten.Wie kettet man mehrere Paging-Anfragen mit node-apac?

Beispiel für theQuery:

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

der Code:

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

Wie Sie sehen, ich von der ersten Anfrage lesen möchten, wie viele Itempages sind für meine ItemSearch und eine neue Anfrage erstellen für jede Artikelseite. Leider wird Promise.all (...). Dann() nie aufgerufen.

Jede Hilfe ist willkommen

+0

hinzugefügt Probe für theQuery – JacobZ

Antwort

0

theQuery wie ein Objekt aussieht. Als solche wird es von Zeiger übergeben, wenn Sie theQuery.ItemPage = i tun, und dann übergeben Sie theQuery, übergeben Sie das gleiche Objekt an jede einzelne Anfrage und überschreiben nur die ItemPage -Eigenschaft für dieses Objekt. Dies funktioniert wahrscheinlich nicht richtig.

Ich weiß nicht genau, was theQuery ist, aber Sie müssen wahrscheinlich eine Kopie davon machen.

Sie können auch ein Versprechen von .getAllPagesForQuery() zurückgeben, anstatt einen Rückruf zu verwenden, da Sie bereits Versprechungen verwenden. Fehlerbehandlung und Verkettung ist viel einfacher mit Versprechen durch den ganzen Weg.

Sie nicht ganz genug Code offen legen, aber hier ist die allgemeine Idee, wie zu beheben:

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

Added vorgeschlagen Code fix auf die Antwort. – jfriend00

+0

cool es ist jetzt die Durchführung der Anfragen und die Eingabe von all(). Then() aber theResults ist ein Array von Funktionen anstelle eines Arrays von Antwortdaten. Hast du eine Ahnung warum? – JacobZ

+0

@JacobZ - Ich folge nicht vollständig, was data.result.ItemSearchResponse.Items.Item' ist. Aber, '.concat()' gibt ein neues Array zurück (es ändert nicht das, das Sie '.concat()' nennen), so dass Sie das Ergebnis wenigstens etwas zuweisen müssen. Ich habe diesen Teil meiner Frage aktualisiert , aber du erklärst nicht wirklich, was du in der 'for (var i = 1; i jfriend00