[英]Async Nested Callbacks using Express + Request node module in a MVC structure
[英]Callbacks for Request Module in Typescript
我想向外部API發出發布請求,然后根據發布請求的響應創建自己的自定義類的對象。 我正在使用request模塊發出發布請求。 我以為我只需要從回調函數返回對象,但是看起來函數在回調完成之前就已返回,因此總是返回空對象。 如何使函數等待回調函數?
發出發布請求的函數:
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 */
}
});
}
無論如何,該函數返回null
,因為條件:
if (parsedJson["status"] === "200")
永遠不會成真。 因此,它僅到達函數末尾,不返回任何值。
您必須尊重這一行代碼的行為: var parsedJson = JSON.parse(JSON.stringify(body));
它具有body
變量(肯定是字符串)作為JSON.stringify
函數的參數。 如此字符串化,您將獲得“字符串對象的字符串”。 使用JSON.parse
解析回它將返回沒有status
屬性的字符串對象,因此parsedJson["status"]
將為null。
您必須嘗試JSON.parse(body)
並仔細檢查body
輸入的“ status”屬性。
編輯:
重要的是要告訴return new Dummy.Dummy(...
從未命名function(error: any, response: http.IncomingMessage, body: any)
返回值, 而不是從read(id: string)
。
由於request.post
使用異步回調,因此您的未命名函數將值返回到無處。 您必須使用回調技術,例如:
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 */
}
});
}
或者,您可以使用更高級的Promises技術或異步流控制庫。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.