Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 等待请求完成_Javascript_Node.js_Httprequest_Mediawiki - Fatal编程技术网

Javascript 等待请求完成

Javascript 等待请求完成,javascript,node.js,httprequest,mediawiki,Javascript,Node.js,Httprequest,Mediawiki,我目前正在尝试为MediaWiki扩展制作node.js包装,我需要能够登录。到目前为止,一切似乎都在工作,但我无法让脚本停止并等待请求完成后再返回。这是至关重要的,因为请求必须在返回之前完成,才能返回正确的值,而不是未定义的值。我正在使用node.js的请求模块。当前的HTTP POST处理程序如下所示 var post = function(data) { var r; var options = {}; options.url = module.expor

我目前正在尝试为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
,将回调函数作为第二个参数,在请求完成时运行。按照惯例,回调应该至少包含两个参数:一个是
错误
,如果一切正常,它应该是
,另一个是
结果
,它是异步过程的结果:

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

太棒了!非常感谢你。