为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

呼啦一阵风 2022-09-16 20:57:15
我正在制作一个程序,该程序采用一系列链接并返回有多少链接已损坏以及有多少链接正在运行。现在,我正在用一个数组来测试它,该数组有四个工作链路和两个断开的链接。这是我的代码: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 }这是我收到的输出:输出我希望控制台只打印一次断开的链接总数,并在完成获取所有链接后打印。
查看完整描述

2 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

你需要先等待所有的承诺。然后,您可以打印结果。另外,要返回任何内容,您需要使函数异步,然后所有外部代码也必须是异步的!


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


查看完整回答
反对 回复 2022-09-16
?
莫回无

TA贡献1865条经验 获得超7个赞

你可以使用“全部承诺”来等待所有承诺被推翻:


/*

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)

*/


查看完整回答
反对 回复 2022-09-16
  • 2 回答
  • 0 关注
  • 109 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信