等待请求完成
我目前正在尝试为MediaWiki扩展创build一个node.js包装,并且我需要能够login。目前为止所有的东西似乎都在工作,但是我无法让脚本在返回之前停止并等待请求完成。 这是至关重要的,因为请求必须在返回之前完成,以便它返回适当的值而不是未定义的。 我正在使用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
方法是asynchronous的,所以你需要使你的包装函数也是asynchronous的:
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); } }); }
然后,您将使用callback函数作为第二个参数来调用post
,以在请求完成时运行。 按照惯例,你的callback应该至less有两个参数:一个error
,如果一切正常的话应该是null
,并且result
是asynchronous过程的结果:
post ({foo: 'bar'}, function(err, result) {...});