美文网首页海纳百川
Promise知识点回顾

Promise知识点回顾

作者: 凛冬已至_123 | 来源:发表于2018-06-25 09:38 被阅读0次

    What is Promise

    Promise 是一个对象,对象里存储一个状态,这个状态是可以随着内部的执行转化的,为以下三种状态之一:等待态(Pending)、完成态(Fulfilled)、拒绝态(Rejected)。

    一开始,我们先设置好等状态从 pending 变成 fulfilled 和 rejected 的预案(当成功后我们做什么,失败时我们做什么)。

    Promise 启动之后,当满足成功的条件时我们让状态从 pending 变成 fullfilled (执行 resolve);当满足失败的条件,我们让状态从 pending 变成 rejected(执行 reject)

    常见的使用方法

    Promise.prototype.then/Promise.prototype.catch

    function getIp() {
      var promise = new Promise(function(resolve, reject){
        var xhr = new XMLHttpRequest()
        xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getIp', true)
        xhr.onload = function(){
          var retJson = JSON.parse(xhr.responseText)  // {"ip":"58.100.211.137"}
          resolve(retJson.ip)
        }
        xhr.onerror = function(){
          reject('获取IP失败')
        }
        xhr.send()
      })
      return promise
    }
    
    function getCityFromIp(ip) {
      var promise = new Promise(function(resolve, reject){
        var xhr = new XMLHttpRequest()
        xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getCityFromIp?ip='+ip, true)
        xhr.onload = function(){
          var retJson = JSON.parse(xhr.responseText)  // {"city": "hangzhou","ip": "23.45.12.34"}
          resolve(retJson.city)
        }
        xhr.onerror = function(){
          reject('获取city失败')
        }
        xhr.send()
      })
      return promise
    }
    function getWeatherFromCity(city) {
      var promise = new Promise(function(resolve, reject){
        var xhr = new XMLHttpRequest()
        xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getWeatherFromCity?city='+city, true)
        xhr.onload = function(){
          var retJson = JSON.parse(xhr.responseText)   //{"weather": "晴天","city": "beijing"}
          resolve(retJson)
        }
        xhr.onerror = function(){
          reject('获取天气失败')
        }
        xhr.send()
      })
      return promise
    }
    
    getIp().then(function(ip){
      return getCityFromIp(ip)
    }).then(function(city){
      return getWeatherFromCity(city)
    }).then(function(data){
      console.log(data)
    }).catch(function(e){
      console.log('出现了错误', e)
    })
    

    提示使用方法

    // 第一种
    var fn=new Promise((resolve,reject)=>{})
    fn().then(()=>{},()=>{}).catch(()=>{})
    //第二种
    return new Promise(()=>{})
    

    理解关键点

    • then和catch是promise.prototype上的方法
    • all和race是promise函数本身的方法
    //Promise.all, 当所有的 Promise 对象都完成后再执行
    Promise.all([p1, p2, p3]).then(data=>{
      console.log(data)
    })
    
    //Promise.race, Promise 对象最先执行完成的返回数据
    Promise.race([p1, p2, p3]).then(data=>{
      console.log(data)
    })
    

    应用

    • 主要用于异步调用
    • 对于回调地狱其实并没有解决,只是换了一种更直观的写法,更符合逻辑思维,一目了然

    相关文章

      网友评论

        本文标题:Promise知识点回顾

        本文链接:https://www.haomeiwen.com/subject/scpeyftx.html