m0_63251914 2022-04-11 09:16 采纳率: 33.3%
浏览 27
已结题

promise和生成器函数的区别

promise和生成器函数都可以解决回掉地狱,他们有什么区别吗?(没在项目中做过)

  • 写回答

2条回答 默认 最新

  • 想被带飞的鱼 2022-04-11 10:14
    关注

    Promise概念:是异步编程的一种解决方案:从语法上讲,promise是一个对象,从它可以获取异步操作的消息;从本意上讲,它是承诺,承诺它过一段时间会给你一个结果。promise有三种状态: pending(等待态),fulfiled(成功态),rejected(失败态);状态一旦改变,就不会再变。创造promise实例后,它会立即执行。

    //es6解决异步代码
     <script>
            console.log("开始");
            console.log("进行");
    //resolve :异步操作执行成功后的回调函数
    //resolve :异步操作执行成功后的回调函数
            let promise = new Promise((resolve, reject) => {
                console.log("异步执行的代码");
                // resolve();
                reject();
            });
            promise.then(() => {
                console.log("执行成功的异步代码");
            }, () => {
                console.log("执行失败的异步代码");
            });
            console.log("结束");
    </script>
    
     //Promise es6实现异步操作
    function timeOut(time){
        return new Promise((resolve,reject)=>{
            setTimeout(()=>{
                resolve();
            },time)
        })
    }
    console.log("开始");
    let promise = timeOut(1000);
    promise.then(()=>{
        console.log("吃饭");
        return timeOut(1000);
    }).then(()=>{
        console.log("睡觉");
        return timeOut(1000);
    }).then(()=>{
        console.log("打豆豆");
    });
    
    //Promise es7实现异步操作
    //- async:加在function前面
    //- await:加载函数里面
           function timeOut(time){
              return new Promise((resolve,reject)=>{
                   setTimeout(()=>{
                       resolve();
                   },time)
               })
           }
           console.log("开始");  
            async function delay(){
                await timeOut(1000);
                console.log("吃饭");
                await timeOut(1000);
                console.log("睡觉");
                await timeOut(1000);
                console.log("打豆豆");
            }
            delay();
           console.log("结束");
    

    生成器(generator):function*
    生成器返回的是一个迭代器

    • yield:挂起代码,在想用的地方调用就行
      概念:
    • 它允许你定义一个包含自有迭代算法的函数, 同时它可以自动维护自己的状态
    • 最初调用时,生成器函数不执行任何代作用码,而是返回一种称为Generator的迭代器。
    • 通过调用生成器的下一个方法消耗值时,Generator函数将执行,直到遇到yield关键字。
    • 可以根据需要多次调用该函数,并且每次都返回一个新的Generator,但每个Generator只能迭代一次。
    <p>我说 <span id="content"></span></p>
    <input type="button" value="点击" id="btn">
    let content = document.getElementById("content");
    let btn = document.getElementById("btn");
    function* say() {
        yield "嗨";
        yield "你在干啥呢";
        yield "我在吃饭呢,等会找你玩哈";
        yield "看到消息请回复,拜拜";
    }
    //生成器返回的是一个迭代器        
    let iterator = say();
    
    btn.onclick = function () {
        // console.log(iterator.next());
        let aa = iterator.next();
        if (!aa.done) {
            // console.log(aa.done);
            content.innerHTML = aa.value;
        }
        else{
            content.innerHTML = "......";
        }
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 4月19日
  • 已采纳回答 4月11日
  • 创建了问题 4月11日

悬赏问题

  • ¥15 同一个网口一个电脑连接有网,另一个电脑连接没网
  • ¥15 神经网络模型一直不能上GPU
  • ¥15 苍穹外卖拦截器token为null
  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关