一個相當原始的問題,但我找不到解決方法:
我在這個范圍內啟動了一個陣列,我需要將一個物件從 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);
});
uj5u.com熱心網友回復:
有兩種方法可以做到這一點。您可以使用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);
uj5u.com熱心網友回復:
更新 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) {
...
你能試試這個嗎?
uj5u.com熱心網友回復:
在頂部,回應變數稱為“response”,在最后一行突然變成“res”。我沒有看到名為“res”的變數的宣告。
這兩個不同的變數還是不幸的復制代碼?
我希望這有幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/535829.html
上一篇:在本機反應中過濾復雜陣列?
