异步功能永远不会停止运行

时间:2018-02-06 15:45:49

标签: javascript node.js

我正在使用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)
})()

2 个答案:

答案 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);
}());