自学内容网 自学内容网

JavaScript 解决并发回调地狱

我们有一个需求需要我们2秒打印1,接着再一秒打印2,再一秒打印3

如果我们直接这样写

        setTimeout(() => {
            console.log(1);
        }, 2000);
        setTimeout(() => {
            console.log(2);
        }, 1000);
        setTimeout(() => {
            console.log(3);
        }, 1000);

这样是肯定不行的,这样是一个异步代码,他们不会同时进行。

传统的嵌套可读性非常差,这时就需要使用promise来解决这种回调地狱问题,如何解决呢?

Promise

Promise是⼀个类,⽤来包装异步操作,根据异步操作的结果,是成功还是失败,
进⽽决定Promise是成功还是失败;Promise⽀持链式调⽤,从⽽消除回调地狱

Promise的状态
1. 只能由 Pending -> Fulfilled ,或 Pening -> Rejected
2. Promise的状态 ⼀旦确定, 就不可改变了

        //封装一个函数 可以获取一个promise的对象 num是传入的参数,duration为等待的事件
        function delay(num,duration) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                resolve(num);//duration秒后将resolve标记为真传入括号里面跟跟着的是回调函数的参数,如果标记为真就会执行对应的回调函数
                }, duration);
            });
        }
        delay(1,2000).then(message1=>{
            console.log(message1); //每次在执行回调函数时会再去返回一个promise对象,以下如此
            return delay(2,1000)
        }).then(message2=>{
            console.log(message2);
            return delay(3,1000)}).then(message3=>{
            console.log(message3);
        });

Async+Await异步终极解决⽅案
 

// 语法
async function log() {// 1、在Promise实例前添加 await 关键字, 那么await的返回值就是当前
// Promise的resolve参数
// 2、await所在的函数必须被async修饰
// 3、async函数内, 当前await执⾏结束了,代码才会继续往后执⾏(同步的⽅式执⾏)
const n1 = await delay(2000, 1)
console.log(n1)
}
log()

所以我们最终代码这样写

function delay(num,duration) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                resolve(num);//duration秒后将resolve标记为真,传入括号里面跟跟着的是回调函数的参数,如果标记为真就会执行对应的回调函数
                }, duration);
            });
        }

        async function log()
        {
            const a=await delay(1,2000);
            console.log(a);
            const b= await delay(2,1000);
            console.log(b);
            const c= await delay(3,1000);
            console.log(c);
        }
        log();


原文地址:https://blog.csdn.net/zgwnb666/article/details/145037643

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!