Promise 实现红绿灯

作者 : 开心源码 本文共1424个字,预计阅读时间需要4分钟 发布时间: 2022-05-12 共135人阅读

利用 Promise 实现一个元素先红色两秒在黄色一秒再绿色三秒,不断循环。目前我想出的有三种方法。

首先是 HTML 代码:

     <table>    <tbody>        <tr>            <td class="light"></td>        </tr>    </tbody></table>

1.第一种方法,这段代码其实只是利用了 setTimeout 的特性,只用 setTimeout 也可以实现。

let light = document.querySelector('.light');function red() {    return new Promise(function(resolve, reject) {        light.style.backgroundColor = 'red';        setTimeout(function() {            resolve(green())        }, 2000);    })}function green() {    return new Promise(function(resolve, reject) {        light.style.backgroundColor = 'green';        setTimeout(function() {            resolve(yellow())        }, 3000);    })}function yellow() {    return new Promise(function(resolve, reject) {        light.style.backgroundColor = 'yellow';        setTimeout(function() {            resolve(red())        }, 1000);    })}red();

2.第二种方法,利用 Promise 和 async 函数的特性,是代码看起来更像是同步。

   let light = document.querySelector('.light');   function lightChange(duration,color) {    return new Promise(function(resolve,reject) {        light.style.backgroundColor = color;        setTimeout(resolve,duration);    })}async function index() {    while(1) {        await lightChange(2000,'red');        await lightChange(1000,'yellow');        await lightChange(3000,'green');    }}// async 函数提供了用同步代码编写异步的方式index();

3.第三种方法用生成器和迭代器模拟 async 函数。这种写法并没有什么意义,只是写着玩,不推荐使用。

   let light = document.querySelector('.light');   function func(color, duration) {    return new Promise(function(resolve, reject) {        light.style.backgroundColor = color;        setTimeout(function() {            it.next();        }, duration)    })}function* main() {    while (1) {        yield func('red',2000);        yield func('yellow',1000);        yield func('green',3000);    }}var it = main();it.next();

Gwen Weustink 2016-03-02 09-53-30 .jpg

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Promise 实现红绿灯

发表回复