美文网首页
promise的使用

promise的使用

作者: 李悦之 | 来源:发表于2017-08-02 23:01 被阅读35次
    1、promise是用来干什么的?
    • 用来处理回调,避免回调地狱
    • 用来更好地处理异步行为
    • 坏的例子:AJAX多级嵌套
    2、用promise写jQuery的AJAX
    let promise = $.ajax({   //这是一个异步的过程,发送请求需要时间,在这里做了一个承诺
      url: './xxx.json',
      method: 'get'
    })
    
    promise.then(function(){  //承诺成功时做什么,失败时做什么
      console.log('成功了')
    },function(){
      console.log('失败了')
    })
    
    

    上面的代码可以简写为:

    $.get('./xxx.json').then(function(){
      console.log('成功了')
    },function(){
      console.log('失败了')
    })
    

    这样就省去了很多代码,即使是用AJAX多级嵌套,也会很看很多:

    $.get('./xxx.json').then(function(response){
      $.get('./yyy.json?id=' + data.id).then(function(){
        console.log('成功')
      },onError)
    },onError)
    
    function onError(){
      console.log('失败了')
    }
    
    3、理解promise的几个demo

    之前的用jQuery使用的promise本身被jQuery改写和封装过,专门用来发请求的。现在再写一个关于promise更加宽泛的例子。

    第一个demo:

    function gumble(call){
      setTimeout(function(){
        console.log('开始')
        var number = Math.random()
        if(number > 0.5){
          call('大')
          return '大'
        }else{
          call('小')
          return '小'
        }
      },1000)
    }
    
    var result = gumble(function call(data){ console.log(data) })
    

    注意理解这个demo里回调,起了一个钩子的作用

    接下来用promise来改写上面的demo:
    这是重点,要背下来

    function getBig(){
      return new Promise(function(resolve,reject){      //new Promise接收一个函数,参数是resolve,reject
        setTimeout(function(){
          console.log('开始')
          var number = Math.random()
          if(number > 0.5){
            resolve('大')    //成功时候的勾子,不用再像之前那样返回什么了
          }else{
            reject('小')      //失败时候的钩子
          }
        },1000)
      })
    }
    
    //下面为上面promise完了以后对应的两种‘后果’
    getBig().then(function(data){  //成功时候的后果,对应resolve()钩子,then不要忘了
      console.log(data)
    },function(data){    //失败时候的后果,对应reject()钩子
      console.log(data)
    })
    

    上面是通过函数,不通过函数的promise:

    var a = new Promise(function(resolve,reject){
      setTimeout(function(){
        var number = Math.random()
        if(number > 0.5){
          resolve('大')
        }else{
          reject('小')
        }
      },1000)
    })
    
    a.then(function(data){
      console.log(data)
    },function(data){
      console.log(data)
    })
    
    4、面试题:promise的执行顺序
    console.log(1)
    function getBig(){
      console.log(2)
      return new Promise(function(resolve,reject){
        console.log(3)
        setTimeout(function(){
          console.log(4)
          console.log('开始')
          var number = Math.random()
          if(number > 0.5){
            resolve('大')
          }else{
            reject('小')
          }
        },1000)
      })
    }
    
    console.log(5)
    let aPromise = getBig()
    console.log(6)
    aPromise.then(function(data){
      console.log(7)
      console.log(data)
    },function(data){
      console.log(7)
      console.log(data)
    })
    

    顺序为:1 5 2 3 6 4 7
    再来一题:

    var a = new Promise(function(resolve,reject){
      console.log(1)
    })
    console.log(2)
    

    顺序为: 1 2
    记住,promise承诺本身会立即执行。

    var a = new Promise(function(resolve,reject){
      resolve()
      console.log(1)
    })
    a.then(function(){
      console.log(2)
    })
    console.log(3)
    

    顺序为: 1 3 2
    注意:promise承诺会立即执行,但是承诺的后果then要下一轮才能执行,承诺的结果需要时间嘛。

    相关文章

      网友评论

          本文标题:promise的使用

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