目录

使用 2: 使用 promise 封装基于定时器的异步




- Promise之前的旧方案都是使用回调函数完成异步编程的操作
- 1、fs 文件操作 如 NodeJS
-
- require('fs').requireFile('./index.html',(error,data)=>{})
-
- 2、数据库操作 如 MongoDB MySQL
-
- 3、 AJAX 网络请求
-
- $.get('/server',(data)=>{})
-
- 4、定时器 setTimeout(()=>{},2000)
2. promise: 启动异步任务 => 返回promie对象 => 给promise对象绑定回调函
- setTimeout(function () { //第一层
- console.log('武林要以和为贵');
- setTimeout(function () { //第二程
- console.log('要讲武德');
- setTimeout(function () { //第三层
- console.log('不要搞窝里斗');
- }, 1000)
- }, 2000)
- }, 3000)
使用promise就可以解决这个问题
- function fn(str){
- var p=new Promise(function(resolve,reject){
- //处理异步任务
- var flag=true;
- setTimeout(function(){
- if(flag){
- resolve(str)
- }
- else{
- reject('操作失败')
- }
- })
- })
- return p;
- }
-
- fn('武林要以和为贵')
- .then((data)=>{
- console.log(data);
- return fn('要讲武德');
- })
- .then((data)=>{
- console.log(data);
- return fn('不要搞窝里斗')
- })
- .then((data)=>{
- console.log(data);
- })
- .catch((data)=>{
- console.log(data);
- })
2. 回调地狱的缺点?
- // 1.创建一个新的promise对象
- const p = new Promise((resolve, reject) => {
- // 执行器函数 同步回调
- // 2.执行异步操作任务
- setTimeout(() => {
- const time = Date.now();
- // 如果当前时间是偶数代表成功,否则代表失败
- // 3.1 如果成功了,调用resolve(value)
- if (time % 2 == 0) {
- resolve("成功的数据, time=" + time);
- } else {
- // 3.2 如果失败了,调用reject(reason)
- reject("失败的数据, time=" + time);
- }
- });
- }, 1000);
-
- //如果传入的参数为 非Promise类型的对象, 则返回的结果为成功promise对象
- //如果传入的参数为 Promise 对象, 则参数的结果决定了 resolve 的结果
-
- p.then(
- (value) => {
- // 接收得到成功的value数据
- console.log("onResolved", value);
- },
- (reason) => {
- // 接收得到失败的reason数据
- console.log("onRejected", reason);
- }
- );
- let p1 = new Promise((resolve, reject) => {
- resolve('OK');
- })
- // let p2 = Promise.resolve('Success');
- let p2 = Promise.reject('Error');
- let p3 = Promise.resolve('Oh Yeah');
-
- //
- const result = Promise.all([p1, p2, p3]);
-
- console.log(result); // Uncaught (in promise) Error
Promise.race 方法: (promises) => {}
- let p1 = new Promise((resolve, reject) => {
- setTimeout(() => {
- resolve('success')
- },1000)
- })
-
- let p2 = new Promise((resolve, reject) => {
- setTimeout(() => {
- reject('failed')
- }, 500)
- })
-
- Promise.race([p1, p2]).then((result) => {
- console.log(result)
- }).catch((error) => {
- console.log(error) // 打开的是 'failed'
- })