以fetch为例详解如何消除js异步的传染性

 更新时间:2023年12月12日 10:09:22   作者:smallStone  
这篇文章主要为大家介绍了以fetch为例详解如何消除js异步的传染性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

如何解决传染性

在开发时候如果遇到一个函数需要调用内部接口才能实现其函数功能,函数又依赖其他异步函数。则就会导致每个函数都变成了异步函数。如何解决这种传染性?如下例子:

// 接口请求
        async function getList() {
            return await fetch('/list.json').then(res => res.json())
        }
        async function task1() {
            return await getList()
        }
        async function task2() {
            return await task1()
        }
        async function task3() {
            return await task2()
        }
        // 执行task3。获取到了getList的返回值
        console.log(task3().then(res => console.log(res)));

从这里我们可以看到,由于getList是异步的,导致整个调用池都变成了异步。

那么有什么办法能让其消除此异步形式呢?

将所有的函数改造成同步函数。然后,自定义一个fetch,将报错拦截再继续调用自身异步函数,如果返回正确值则就触发其包含的下一步实现。

如下代码:

function getList() {
            // 此处发送一个异步请求
            return fetch('/list.json')
        }
        function task1() {
            return getList()
        }
        function task2() {
            return task1()
        }
        function task3() {
            return task2()
        }
        /* 我们先写一个main函数  */
        function main() {
            const task3Run = task3()
            console.log(task3Run)
        }
        function run(fn) {
            /* 判断是否为promise函数 */
            const cache = []
            let i = 0
            const _originalFetch = window.fetch
            window.fetch = (...args) => {
                /* 发送请求,且报错 */
                /* 判断缓存如果存在,则交付缓存 */
                if (cache[i]) {
                    if (cache[i].status == 'fulfillled') {
                        return cache[i].data
                    } else if (cache[i].status == 'rejected') {
                        throw cache[i].err
                    }
                }
                const result = {
                    status: 'pending',
                    data: null,
                    err: null
                }
                cache[i++] = result
                const prom = _originalFetch(...args)
                    .then(res => res.json())
                    .then((resolve)=> {
                        result.status = 'fulfillled'
                        result.data = resolve
                    }, (inject) => {
                        result.status = 'rejected'
                        result.err = inject
                    })
                // 报错
                throw prom
            }
            try {
                fn()
            } catch (err) {
                if (err instanceof Promise) {
                    const reRun = () => {
                        i = 0;
                        fn()
                    }
                    err.then(reRun, reRun)
                }
            }
        }
        run(main)

以上就是以fetch为例详解如何消除js异步的传染性的详细内容,更多关于fetch消除js异步传染性的资料请关注脚本之家其它相关文章!

相关文章

  • js实现浏览器倒计时跳转页面效果

    js实现浏览器倒计时跳转页面效果

    这篇文章主要为大家详细介绍了js浏览器倒计时跳转页面效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • JavaScript简单遍历DOM对象所有属性的实现方法

    JavaScript简单遍历DOM对象所有属性的实现方法

    这篇文章主要介绍了JavaScript简单遍历DOM对象所有属性的实现方法,涉及JavaScript针对页面元素属性操作的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-10-10
  • JS验证日期的格式YYYY-mm-dd 具体实现

    JS验证日期的格式YYYY-mm-dd 具体实现

    这篇文章介绍了JS对日期格式的验证实例,有需要的朋友可以参考一下
    2013-06-06
  • js中new一个对象的过程

    js中new一个对象的过程

    本文主要介绍了js中new一个对象的过程。具有很好的参考价值,下面跟着小编一起来看下吧
    2017-02-02
  • 详谈for循环里面的break和continue语句

    详谈for循环里面的break和continue语句

    下面小编就为大家带来一篇详谈for循环里面的break和continue语句。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 微信小程序中this.data与this.setData的区别详解

    微信小程序中this.data与this.setData的区别详解

    这篇文章主要给大家介绍了关于微信小程序中this.data与this.setData区别的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧
    2018-09-09
  • JS try catch基本用法以及常见的异常处理

    JS try catch基本用法以及常见的异常处理

    JS异常处理的作用是帮助开发者识别和处理运行时的错误和异常情况,确保程序在出现问题时能够优雅地降级或恢复,而不是导致整个应用崩溃或产生不可预测的行为,这篇文章主要介绍了JS try catch基本用法以及常见的异常处理,需要的朋友可以参考下
    2025-04-04
  • 微信小程序webview postmessage通信完整配置和使用

    微信小程序webview postmessage通信完整配置和使用

    这篇文章主要介绍了微信小程序webview postmessage通信完整配置和使用的相关资料,Webview组件作为小程序中能够与原生页面进行通信的桥梁,更是受到了广大开发者的关注,需要的朋友可以参考下
    2026-02-02
  • 一文带你搞懂JS中导入模块import和require的区别

    一文带你搞懂JS中导入模块import和require的区别

    JavaScript中,模块是一种可重用的代码块,它将一些代码打包成一个单独的单元,并且可以在其他代码中进行导入和使用。JavaScript中有两种常用的方式:使用import和require,本文主要聊聊他们二者的区别
    2023-03-03
  • JavaScript从数组中删除某个特定元素的多种方法

    JavaScript从数组中删除某个特定元素的多种方法

    数组操作是编程中非常常见的一项技能,尤其是在处理数据、管理列表和更新界面时,删除数组中的特定元素是我们常见的操作之一,本文将介绍如何从数组中删除某个特定的元素,并结合实际项目代码示例进行讲解,需要的朋友可以参考下
    2025-06-06

最新评论