猿问

在 NODE 中使用承诺.js // 控制台日志会多次打印结果

我正在制作一个程序,该程序采用一系列链接并返回有多少链接已损坏以及有多少链接正在运行。现在,我正在用一个数组来测试它,该数组有四个工作链路和两个断开的链接。这是我的代码:

function getBrokenLinks(linksArr){    let links = linksArr    let brokenLinks = 0
    links.forEach(link => {        fetch(link.href)
            .then( res => {                if ( res.status != 200 ){
                    brokenLinks++
                }
            }).then( () => {console.log(brokenLinks)})
    })    return brokenLinks
}

这是我收到的输出:

输出

我希望控制台只打印一次断开的链接总数,并在完成获取所有链接后打印。


呼啦一阵风
浏览 110回答 2
2回答

皈依舞

你需要先等待所有的承诺。然后,您可以打印结果。另外,要返回任何内容,您需要使函数异步,然后所有外部代码也必须是异步的!async function getBrokenLinks (linksArr) {    let brokenLinks = 0    await Promise.all(linksArr.map(link => (async () => {      try {        const res = await fetch(link.href)        if (res.status != 200) brokenLinks++      } catch (e) {        brokenLinks++      }    })()))    console.log(brokenLinks)    return brokenLinks} 

莫回无

你可以使用“全部承诺”来等待所有承诺被推翻:/*Promise.all([promise1, promise2,..]).then(function() {    // all promises have been resolved})*/function getBrokenLinks(linksArr) {    let links = linksArr    let brokenLinks = 0    let promises = []    links.forEach(link => {        // save promise to push onto array        let promise = fetch(link.href)        .then(res => {            if (res.status != 200) {                brokenLinks++            }        })        promises.push(promise)    })    return Promise.all(promises)    .then(() => {        return brokenLinks    })} // Calling code:/*getBrokenLinks([]).then(console.log)*/
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答