我正在使用NodeJS运行此函数,但是该过程永远不会停止运行,尽管事实上我在所有承诺都已解决后返回一个值。
如何修改此代码,以便函数在完成后终止?
let Parser = require('rss-parser');
let parser = new Parser();
var sources = {
feed1: 'http://www.example.url/feed',
feed2: 'http://www.another.url/feed'
}
(async() => {
var promises = [];
for (var feedName in sources) {
if (sources.hasOwnProperty(feedName)) {
const result = parser.parseURL(sources[feedName])
promises.push(result)
}
}
return await Promise.all(promises)
})()
答案 0 :(得分:0)
您可以采用一种简单的方法在一个数组中处理promises,以便在解析每个url后捕获它们。像这样:
let Parser = require('rss-parser');
let parser = new Parser();
var sources = {
feed1: 'http://www.example.url/feed',
feed2: 'http://www.another.url/feed'
}
function parsePromise(url) {
return new Promise((resolve,reject) => {
let data = parser.parseURL(url);
resolve(data);
});
}
// main
toread = [];
for (var feedName in sources) {
let url = sources[feedName];
let p = parsePromise(url);
toread.push(p);
}
Promise.all(toread).then((data) => {
console.log(data);
});
答案 1 :(得分:0)
首先,我认为您的async
箭头功能不正确。你实际上并没有正确地调用它。请参阅此问题中async
箭头函数的语法:Syntax for async arrow function。
由于您已经尝试立即执行匿名功能,因此只需使用function
声明而不是箭头。
此外,您正在尝试从匿名的,立即调用的函数返回一些内容,并且您不会对返回的值执行任何操作。
不仅如此,你await
Promise.all()
只是因为async
函数返回Promises
无论如何都要等待承诺包含在Promise中什么。
其次,使用更多map()
s或中间值,以便更清楚地编程流程。 await
的好处是你可以编写看起来像同步代码的内容,但它将以异步方式处理。
const Parser = require("rss-parser"),
parser = new Parser();
const sources = {
feed1: "https://sports.yahoo.com/nhl/teams/bos/rss.xml",
feed2: "https://sports.yahoo.com/nhl/teams/buf/rss.xml"
};
(async function () {
let data
try {
const sourcesArr = Object.keys(sources).map(k => sources[k]),
feedPromises = sourcesArr.map(source => parser.parseURL(source));
data = await Promise.all(feedPromises);
} catch (err) {
console.error(err);
}
console.log(data);
}());