我有这个小代码片段:
var okidok = parseString(myXml, (err, result) => {
console.log(result.rss.channel[0].item); //Gives the output that I want.
return result.rss.channel[0].item;
});
console.log(okidok); //Output is rubbish.
为什么okidok没有分配从parseString
返回的值。所有这些都发生在异步函数中。
如果有人能够启发我,我会非常感激!
答案 0 :(得分:2)
如果在ES7异步功能中发生这种情况,您可以等parseString
函数来解决此问题:
首先,你需要宣传parseString
(如果它还没有那么):
function parseStringPromise(text){
return new Promise((resolve,reject) => {
parseString(text, (err, result) => {
if(err) return reject(err);
return resolve(data);
});
});
}
然后您可以await
使用此函数在async function
中将结果置于其范围之外:
async function parseXml(myXml) {
const result = await parseStringPromise(myXml);
var okidok = result.rss.channel[0].item;
}
请注意,您可以添加try/catch
语句来处理异步函数中的错误。
编辑:我忘了告诉你为什么。
您没有相同的结果,因为parseString
函数是节点样式回调(“nodeback”)异步函数。异步函数意味着您必须等待它才能解析才能获得结果。异步函数有一些不同的类型,主要的2是基于回调(如parseString
)和承诺(.then(fn)
或await
可解析{ {1}})。
为了在函数上使用async functions
,此函数需要返回一个promise(这就是我们宣传 await
的原因)
这是一个易于理解的承诺教程:https://scotch.io/tutorials/javascript-promises-for-dummies