【问题标题】:Callbacks for Request Module in TypescriptTypescript 中请求模块的回调
【发布时间】:2016-08-23 03:34:45
【问题描述】:

我想向外部 API 发出 post 请求,然后根据 post 请求的响应创建我自己的自定义类的对象。我正在使用请求模块来发出发布请求。我以为我只需要从回调函数返回对象,但看起来函数在回调完成之前返回,所以总是返回一个空对象。如何让函数等待回调函数?

发出 post 请求的函数:

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

【问题讨论】:

    标签: javascript node.js typescript request


    【解决方案1】:

    函数无论如何都会返回null,因为条件:

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

    永远不会成为真的。所以它只是到达函数的末尾并且不返回任何值。

    您必须注意这行代码行为:var parsedJson = JSON.parse(JSON.stringify(body));

    它有body 变量(肯定是字符串)作为JSON.stringify 函数的参数。所以字符串化字符串你会得到“字符串对象的字符串”。用JSON.parse 解析它会返回没有status 属性的字符串对象,所以parsedJson["status"] 将为空。

    您必须尝试 JSON.parse(body) 并仔细检查 body 输入的“状态”属性。

    编辑:

    重要的是要告诉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 技术或异步流控制库。

    【讨论】:

    • 我尝试在if 检查中记录新的 Dummy 对象,它正确打印了 Dummy 对象,因此它进入了if 中。我也尝试解析body而不首先对其进行字符串化(出于您建议的原因),但它不起作用(我不知道为什么),但在字符串化之后它起作用了(仍然不知道为什么)。
    • 我检查了 request.get 的文档。将json 参数设置为请求强制函数将response 正文自动解析为JSON,因此您根本不需要var parsedJson = JSON.parse(body); 代码,您可以改用body["status"] === "200"。检查我的答案编辑以获取更多解释。
    • 谢谢你的例子。我仍然对如何将 Dummy 对象实际返回给调用 read 函数的函数感到困惑。我创建了一个回调函数,它简单地将 Dummy 对象作为参数(如您在上面指出的那样),然后返回 Dummy 对象。然后我将该函数作为参数传递给调用read 函数的函数。但是函数在完成回调之前仍然返回...
    • 您不能通过return 将异步代码中的值同步。正如我之前的意思,您可以通过回调解决此问题。它像这样工作jsfiddle.net/t0dgedy0
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多