【问题标题】:Wait for request to finish等待请求完成
【发布时间】:2014-03-16 21:47:22
【问题描述】:

我目前正在尝试为 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;
};

【问题讨论】:

    标签: javascript node.js httprequest mediawiki


    【解决方案1】:

    因为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) {...});
    

    【讨论】:

    • 这真是太棒了!非常感谢。
    猜你喜欢
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-22
    • 2020-06-08
    • 2018-08-20
    相关资源
    最近更新 更多