异步解决方案---promise

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

内容简介: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)
    }) 
复制代码

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

查看所有标签

猜你喜欢:

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

编程匠艺

编程匠艺

(美)古德利弗(Goodliffe, P.)著 / 韩江,陈玉译 / 电子工业出版社 / 2008-9 / 79.00元

如果你可以编写出合格的代码,但是想更进一步、创作出组织良好而且易于理解的代码,并希望成为一名真正的编程专家或提高现有的职业技能,那么《编程匠艺——编写卓越的代码》都会为你给出答案。本书的内容遍及编程的各个要素,如代码风格、变量命名、错误处理和安全性等。此外,本书还对一些更广泛的编程问题进行了探讨,如有效的团队合作、开发过程和文档编写,等等。本书各章的末尾均提供一些思考问题,这些问题回顾了各章中的一......一起来看看 《编程匠艺》 这本书的介绍吧!

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

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

HEX HSV 互换工具