异步解决方案---promise

栏目: JavaScript · 发布时间: 7年前

内容简介:Promise.all(promise提供了一个 并发的方法 Promise.all 返回的结果是一个promise,只有传递的promise数组全部成功才会返回成功态)
  • 回调地狱 如果多个异步请求 有连带关系 回调嵌套
  • 多个异步实现并发的话,会出现无法同步异步的返回结果
  • 错误处理不方便

什么是promise(承诺)

  • promise 有三个状态 (成功态 Resolved 失败态 Rejected 等待态 Pending)
  • 默认情况下 状态转换(状态不可逆)
    • pending -> resolved
    • pending -> rejected
    • resolved 不能和rejected相互转换
  • 用法:promise在ie下是不兼容的(可以使用webpack的polyfill等方式解决)
// new Promise的时候 需要传递一个executor执行器,执行器函数会默认被内部所执行
    new Promise(function(resolve,reject){
        // 如果在这里调用了resolve  就会变成成功态
        console.log('hello')   // 第一个执行
    })
    
    console.log('hello1') // 第二个执行
复制代码
let p = new Promise(function(resolve.reject){
        resolve();
    })
    // 每个promise(实例)都有一个then方法
    // then方法是一个异步方法,默认不会再当前的上下文中执行(微任务)且比setTimeout先执行
    p.then(function(){
        console.log('成功')
    },function(){
        console.log('失败')
    })
复制代码
// 面试题
    setTimeout(function(){
        console.log(1)
    },0)
    new Promise(function(resolve){
        console.log(2)
        for(var i = 0;i<10;i++){
            i==9 && resolve()
        }
        console.log(3)
    }).then(function(){
        console.log(4)
    })
    console.log(5)
    
    // 2 3 5 4 1
复制代码

promise解决异步的基本使用

  • promise 每次调用then后,分下面几种情况
    • 如果返回的是promise 用promise的成功或者失败 执行下一个then
    • 如果返回的是一个普通值(包括不写return,默认return undefined)会走外层下一个then的成功
    • 如果执行的时候,抛出异常就会走到下一个then中的失败
    • then中可以不传递参数,如果不传递 会透到下一个then中
  • catch用来捕获错误的,相当于then的第一个参数传递null catch之后仍然可以继续then
let fs = require('fs')  
   
   function read(file){
       return new Promise(function(resolve,reject){
           fs.readFile(file,'utf8',function(err,data){
               if(err) reject(err)
               resolve(data)
           })
        })
   }
   // promise的链式调用
   read('./name.txt').then(function(data){
       // then方法成功后 返回的是一个新的promise 这个返回的promise会被执行,如果返回的promise是成功的,会把这个结果传递到外层的下一个then中    
        // return read(data)  返回下一个then成功
        // throw new Error('出错了')  返回下一个then失败
        return data  // 返回下一个then成功
   },function(err){
       console.log(err)
   }).then(function(data){
       console.log('age',data)
   }).then().catch(function(err){
       console.log('error',err)
   }).then(function(data){
       console.log(data)
   })
复制代码
// 面试题
    new Promise(function(resolve,reject){
        resolve(1)
    })
    .then(function(data){
        console.log(data)
        return 2;
    })
    .catch(function(err){
        return 3;
    })
    .then(function(res){
        console.log(res)
    })
    // 1 2
复制代码

Promise.all(promise提供了一个 并发的方法 Promise.all 返回的结果是一个promise,只有传递的promise数组全部成功才会返回成功态)

Promise.all([read('./name.txt'),read('./age.txt')]).then(function(data){
        console.log(data)
    }).catch(function(err){
        console.log(err)
    }) 
复制代码

Promise.race(只要有一个返回成功 就返回成功态)

Promise.race([read('./name.txt'),read('./age.txt')]).then(function(data){
        console.log(data)
    }).catch(function(err){
        console.log(err)
    }) 
复制代码

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Flash PHP实用开发技术

Flash PHP实用开发技术

Steve Webster著、王黎译 / 王黎 / 清华大学出版社 / 2002-3 / 39.00元

本书将介绍服务器端脚本所提供的各种可能的操作方案,帮助读者掌握设计数据库集成程序和高端应用程序的知识。一起来看看 《Flash PHP实用开发技术》 这本书的介绍吧!

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具