簡體   English   中英

打字稿中請求模塊的回調

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM