JavaScript: out of scope变量导致错误



一个相当原始的问题,但我不知道如何解决:

我有一个数组启动,在这个范围内,我需要从JSON(从XML转换)推送一个对象到一个数据数组,它在循环中收集数据,我只需要在范围外返回响应,因为在范围内它还没有满。

我如何解决这个相当原始的问题?

我的最小示例如下:

{
...
dataarr.push(jsonObj['soap:Envelope']['soap:Body']['ns:Response']['return']['items']);
} // scope 1 ends here
res.status(200).send(dataarr); // out of scope in this scope 2 the response has to be sent back to the client

我得到错误,因为变量超出了作用域,我如何解决这个问题?

更新1

更多的代码:

let dataarr = [];
let payloadarr = [];
...
axios(config)
.then(function (response) {
logger.log('info', 'POST /getdata successful from ' + req.ip);
var options = {
attributeNamePrefix : "@_",
attrNodeName: "attr", //default is 'false'
textNodeName : "#text",
ignoreAttributes : true,
ignoreNameSpace : false,
allowBooleanAttributes : false,
parseNodeValue : true,
parseAttributeValue : false,
trimValues: true,
cdataTagName: "__cdata", //default is 'false'
cdataPositionChar: "\c",
parseTrueNumberOnly: false,
arrayMode: false, //"strict"
attrValueProcessor: (val, attrName) => he.decode(val, {isAttributeValue: true}),//default is a=>a
tagValueProcessor : (val, tagName) => he.decode(val), //default is a=>a
stopNodes: ["parse-me-as-string"]
};
console.log("response.data:");
console.log(response.data);
if( parser.validate(response.data) === true) { //optional (it'll return an object in case it's not valid)
var jsonObj = parser.parse(response.data,options);
}
var tObj = parser.getTraversalObj(response.data,options);
var jsonObj = parser.convertToJson(tObj,options);
console.log("jsonObj in parsing:");
console.log(jsonObj);
console.log(jsonObj['soap:Envelope']['soap:Body']['ns:getResponse']['return']['items']);
dataarr.push(jsonObj['soap:Envelope']['soap:Body']['ns:getResponse']['return']['items']);
console.log("dataarr getting filled:");
console.log(j);
console.log(dataarr);
})
.catch(function (error) {
logger.warn('[/getdocumentmetadata]: ', new Error(error));
//console.log(error);
});
}
})
.catch(function (error) {
logger.warn('[GET /getdocuments]: ', new Error(error));
});
res.status(200).send(dataarr);
});

有两种方法。您可以使用await等待每个结果,也可以使用Promise.all异步运行它们并等待最终结果。

选项1

let dataArr = [];
for(...){
const myData= await axios(config).then(res => {
var jsonObject = parse(res);
return jsonObject;
}).catch(...);
dataArr.push(myData)
}
res.status(200).send(dataArr);

选项2

let promises = [];
for(){
promises.push(axios(config).then(res => {
var jsonObject= parse(res);
return jsonObject;
})
.catch(...));
}
let dataArr = await Promise.all(promises);
res.status(200).send(dataArr);

UPDATE 1

您不等待axios调用,因此在填充dataarr之前函数已解析。

let dataarr = [] // at the top of you function
...
await new Promise((resolve, reject) => axios(config)
.then(function (response) {
...
resolve()
})
.catch(function (error) {
...

你能试试这个吗?

顶部的响应变量名为"response"在最后一行,它突然"恢复"了。我没有看到变量"res"的声明。

这是两个不同的变量还是不幸复制的代码?

我希望这对你有帮助。

最新更新