2016-08-23 5 views
0

Ich möchte eine Post-Anfrage an eine externe API, dann ein Objekt meiner eigenen benutzerdefinierten Klasse basierend auf der Antwort von der Post-Anfrage erstellen. Ich verwende das Anforderungsmodul, um die Postanforderung zu stellen. Ich dachte, ich würde einfach das Objekt von der Callback-Funktion zurückgeben, aber es sieht so aus, als ob die Funktion zurückgibt, bevor der Rückruf abgeschlossen ist, so dass immer ein Null-Objekt zurückgegeben wird. Wie kann ich die Funktion auf die Callback-Funktion warten lassen?Rückrufe für Request-Modul in Typescript

Funktion, die die Post-Anforderung macht:

read(id: string) { 
    request.post({ 
     headers: { 
      "content-type": "application/json" 
     }, 
     url: baseUrl + service, 
     json: { 
      "id": id 
     } 
    }, function(error: any, response: http.IncomingMessage, body: any) { 
     if (!error && response.statusCode === 200) { 
      var parsedJson = JSON.parse(JSON.stringify(body)); 
      /* tslint:disable:no-string-literal */ 
      if (parsedJson["status"] === "200") { 
       var data = parsedJson["data"]; 
       return new Dummy.Dummy(id, data["dummy"]["value"], data["dummy2"]["value"], data["dummy3"]["value"]); 
      } 
      /* tslint:enable:no-string-literal */ 
     } 
    }); 
} 

Antwort

0

Funktion liefert null sowieso, weil die Bedingung:

if (parsedJson["status"] === "200") 

nie wahr wird. So kommt es nur zum Ende der Funktion und gibt keinen Wert zurück.

Sie müssen diese Codezeile Verhalten ispect: var parsedJson = JSON.parse(JSON.stringify(body));

Es hat body Variable (dh String sicher) als Argument an die JSON.stringify Funktion. Wenn Sie die Zeichenfolge stringieren, erhalten Sie "String of String Object". Wenn Sie es mit JSON.parse zurücksenden, erhalten Sie ein String-Objekt, das keine status-Eigenschaft hat, so dass parsedJson["status"] null ist.

Sie müssen versuchen JSON.parse(body) und überprüfen Sie body Eingang für "Status" -Eigenschaft.

Edit:

Es ist wichtig zu sagen, dass return new Dummy.Dummy(... den Wert von unnamed function(error: any, response: http.IncomingMessage, body: any) zurückgibt, nicht vom read(id: string).

Da request.post Async-Callback verwendet, gibt die unbenannte Funktion keinen Wert zurück. Sie müssen Callback Technik verwenden, zB:

read(id: string, callback:(any) => any) { 
    request.post({ 
     headers: { 
      "content-type": "application/json" 
     }, 
     url: baseUrl + service, 
     json: { 
      "id": id 
     } 
    }, function(error: any, response: http.IncomingMessage, body: any) { 
     if (!error && response.statusCode === 200) { 
      var parsedJson = JSON.parse(body); 
      /* tslint:disable:no-string-literal */ 
      if (parsedJson["status"] === "200") { 
       var data = parsedJson["data"]; 
       callback(Dummy.Dummy(id, data["dummy"]["value"], data["dummy2"]["value"], data["dummy3"]["value"])); 
      } 
      /* tslint:enable:no-string-literal */ 
     } 
    }); 
} 

Oder können Sie erweiterte Promises techique oder Asynchron-Flow-Control-Bibliotheken verwenden.

+0

Ich habe versucht, das neue Dummy-Objekt in der 'if'-Prüfung zu protokollieren, und es druckt korrekt das Dummy-Objekt, so dass es in das' if' geht. Ich habe auch versucht, "body" zu analysieren, ohne sie zuerst zu stringieren (aus den von Ihnen vorgeschlagenen Gründen), und es hat nicht funktioniert (ich weiß nicht warum), aber es funktionierte nach dem Streichen (weiß immer noch nicht warum). – fluffychaos

+0

Ich habe die Dokumentation für 'request.get' überprüft. Setzen Sie den Parameter 'json' so, dass die forces-Funktion automatisch 'response' body als JSON parst, also brauchen Sie 'var parsedJson = JSON.parse (body);' code überhaupt können Sie 'body [" status "] == verwenden = "200" 'stattdessen. Überprüfen Sie meine Antwort bearbeiten für einige weitere Erklärungen. – SergeyK

+0

Danke für das Beispiel. Ich bin immer noch verwirrt darüber, wie das Dummy-Objekt tatsächlich an die Funktion zurückgegeben wird, die die "read" -Funktion aufruft. Ich habe eine Callback-Funktion erstellt, die einfach das Dummy-Objekt als Parameter verwendet (wie oben angegeben) und dann das Dummy-Objekt zurückgibt. Ich habe dann die Funktion als Parameter an die Funktion übergeben, die die 'read'-Funktion aufruft. Aber die Funktion kehrt immer noch zurück, bevor der Rückruf beendet wird ... – fluffychaos