等待请求完成

Wait for request to finish

本文关键字:请求 等待      更新时间:2023-09-26

我目前正试图使一个MediaWiki扩展的node.js包装器,我需要能够登录。到目前为止,一切似乎都在工作,但我不能让脚本停止并等待请求完成返回之前。这是至关重要的,因为请求必须在返回之前完成,以便返回正确的值而不是未定义的值。我正在使用node.js的请求模块。当前HTTP POST处理程序如下

var post = function(data) {
    var r;
    var options = {};
        options.url = module.exports.apipath;
        options.method = "POST";
        options.form = data;
    request(options, function(error, response, body) {
         if (!error) {
            if(response.statusCode == 200) {
                try {
                    if((typeof body) == "string") {
                        var result = JSON.parse(body);
                        r = result;
                    } else {
                        r = body;
                    }
                } catch (e) {
                    return;
                }
            }
        } else {
            console.log("Error: " + error);
        }
    });
    return r;
};

因为request方法是异步的,所以您需要使您的包装器函数也是异步的:

var post = function(data, callback) {
    var r;
    var options = {};
        options.url = module.exports.apipath;
        options.method = "POST";
        options.form = data;
    request(options, function(error, response, body) {
         if (!error) {
            if(response.statusCode == 200) {
                try {
                    if((typeof body) == "string") {
                        var result = JSON.parse(body);
                        r = result;
                    } else {
                        r = body;
                    }
                    // Call callback with no error, and result of request
                    return callback(null, r);
                } catch (e) {
                    // Call callback with error
                    return callback(e);
                }
            }
        } else {
            console.log("Error: " + error);
            return callback(error);
        }
    });
}

然后,您将使用回调函数作为第二个参数调用post,该参数将在请求完成时运行。按照惯例,您的回调应该至少接受两个参数:一个error,如果一切正常,它应该是null,一个result是异步进程的结果:

post ({foo: 'bar'}, function(err, result) {...});