2017-12-14 3 views
0

Ich arbeite mit einer API, die es mir ermöglicht, Daten mit einer lokalen DB zu synchronisieren. Es gibt eine syncReady-API, die ich rekursiv aufruft, bis der Synchronisierungsstapel bereit ist, mit dem Senden von Daten zu beginnen. Die Rekursion funktioniert ordnungsgemäß und der Callback wird aufgerufen, aber die Resolve-Funktion löst die Antwort niemals auf.Node.JS rekursives Versprechen löst nicht

const request = require('request-promise'); 
const config = require('../Configs/config.json'); 

function Sync(){} 

Sync.prototype.syncReady = function (token, batchID) { 
    return new Promise((res, rej) => { 
     config.headers.Get.authorization = `bearer ${token}`; 
     config.properties.SyncPrep.id = batchID; 
     request({url: config.url.SyncReady, method: config.Method.Get, headers: config.headers.Get, qs: config.properties.SyncPrep}) 
      .then((response) => { 
       console.log(`The Response: ${response}`); 
       res(response); 
      }, (error) => { 
       console.log(error.statusCode); 
       if(error.statusCode === 497){ 
        this.syncReady(token, batchID); 
       } else rej(error); 
      } 
     ); 
    }); 
}; 

Ich erhalte die angemeldet 497 und die „Die Antwort: {“ pagesTotal „; 0}“ Antwort, aber die res (Antwort) nie die Antwort unten in der Kette sendet. Ich habe eine console.log-Nachricht entlang der gesamten Kette hinzugefügt und keine der .then-Funktionen, die die Kette herunterfeuert, werden ausgelöst.

Ich hoffe ich habe das gut genug erklärt :-). Irgendwelche Ideen, warum das Versprechen sich nicht löst?

Danke!

Antwort

2

Zuerst müssen Sie nichts umbrechen, das eine Zusage mit einer new Promise zurückgibt. Zweitens, für Ihren Fehlerfall lösen Sie das Versprechen nicht, wenn es 497 ist.

const request = require('request-promise'); 
 
const config = require('../Configs/config.json'); 
 

 
function Sync(){} 
 

 
Sync.prototype.syncReady = function (token, batchID) { 
 
     config.headers.Get.authorization = `bearer ${token}`; 
 
     config.properties.SyncPrep.id = batchID; 
 
     return request({url: config.url.SyncReady, method: config.Method.Get, headers: config.headers.Get, qs: config.properties.SyncPrep}) 
 
      .then((response) => { 
 
       console.log(`The Response: ${response}`); 
 
       return response; 
 
      }) 
 
      .catch((error) => { 
 
       console.log(error.statusCode); 
 
       if(error.statusCode === 497){ 
 
        return this.syncReady(token, batchID); 
 
       } else { 
 
        throw error; 
 
       } 
 
      }) 
 
    ); 
 
};

Vielleicht so etwas wie die oben wird stattdessen für Sie arbeiten. Vielleicht versuchen Sie es stattdessen oben. Als allgemeine Faustregel gilt, dass Sie fast immer eine Promise zurückgeben möchten.

+0

Danke! Die Lösung des 497 war der Schlüssel zur Lösung der Kette. res (this.syncReady (Token, BatchID)); – DrFiasco

+0

Wirklich, ich würde sehr empfehlen gegen das Einwickeln, dass ein Versprechen in einem anderen Versprechen, weil alles, was Sie tun müssen, ist das Versprechen selbst zurückzugeben. – Goblinlord

Verwandte Themen