我在Node应用中更新全局变量时遇到问题。有人可以查看我的代码,让我知道出了什么问题吗?只要我的HTTP响应对象没有" next"我已经定义了一个dowhile循环来运行。定义。在循环内部,事情按预期运行并且定义了new_json.next,但while条件返回错误,因为new_json.next在那里未定义。我在Javascript上有点新鲜,所以不知何故我的变量范围已关闭,但我无法根据其他问题弄清楚如何正确地做事。
function make_pagination_request(json, create_response_data) {
var new_json={};
do {
var options = {
host: slug + '.nationbuilder.com', //should be replaced to be site-agnostic
path: json.next,
method: "GET",
json: true,
headers: {
"content-type": "application/json",
"accept": "application/json"
},
}
var req = https.get(options, req_callback);
function req_callback(response) {
response.on('data', function(chunk) {
str += chunk;
});
response.on('end', function(new_json) {
new_json=JSON.parse(str);
new_results = new_json.results
results= results.concat(new_results);
console.log("combinedlength: " + results.length)
console.log(new_json.next);
});
}
} while (new_json.next.includes("api"));
答案 0 :(得分:1)
问题是HTTPs请求是异步的,而do / while循环是同步的。在这种情况下,在将包含next
的值分配给new_json
变量之前,会到达while语句。
第一次到达while语句时,尚未调用回调函数。因此,new_json
的值为{}
(初始值)且缺少next
。因此您遇到的错误。
但解决方案并未修复new_json
的初始值。解决方案是删除do / while循环并继续在HTTPs请求回调中工作。
答案 1 :(得分:0)
这是我工作的代码。谢谢yeiniel。我最终只是从它自己的末尾调用函数make_pagination_request。我还做了一些与原始问题无关的其他更改,但这些更改是调试所必需的。
function make_pagination_request(json, create_response_data, callback, tokens, options) {
path = json.next + "&access_token=" + tokens[slug];
var options = {
host: slug + '.nationbuilder.com', //should be replaced to be site-agnostic
path: path,
method: "GET",
json: true,
headers: {
"content-type": "application/json",
"accept": "application/json"
},
}
var str='';
var req = https.get(options, req_callback);
function req_callback(response, create_response_scripts) {
response.on('data', function(chunk) {
str += chunk;
});
response.on('end', function() {
new_json=JSON.parse(str);
new_results = new_json.results
results= results.concat(new_results);
console.log('combined_length: ' + results.length)
if (new_json.next) {
make_pagination_request(new_json, create_response_data,create_response_scripts, tokens, options);
} else {
create_response_data(results, query, create_response_scripts);
}
});
}
}