美文网首页
2020-08-15 Promise

2020-08-15 Promise

作者: Slash_Youth | 来源:发表于2020-09-07 22:14 被阅读0次

1.promise

var p = new Promise(function(resolve, reject){
    //做一些异步操作
    setTimeout(function(){
        console.log('执行完成');
        resolve('随便什么数据');
    }, 2000);
});
Promise为何出现?

为了解决callback Hell

Promise的状态

promise有三种状态:

  1. pending (初始化状态)
  2. fulfilled (成功)
  3. rejected (失败)

Promise对象的状态改变,只有两种可能:从pending变为resolved、从pending变为rejected,之后状态不会在改变了且状态不可逆。

Promise常用的基本的用法

一、resolve reject

Promise基本语法

  1. new Promise 实例 要return
  2. 传入函数 要有resolve reject 俩参数
  3. 成功执行resolve 失败 reject
  4. then 监听结果并且接收结果

不使用Promise的话模拟一个callback Hell

function loadImg(src, callback, fail){
  var img = document.createElement('img')
  img.onload = function () {
    callback(img)
  }
  img.onerror = function () {
    fail()
  }
  img.src = src
}
var src = 'www.s.com/index/logo.png'

loadImg(src, function (img) {
  console.log(img.width)// callback Hell 我们还要做好多事情 这样看的就很不友好
}, function () {
  console.log('failed')
})

使用Promise

function loadImg(src) {
  const promise = new Promise(function(resolve,reject){
    img.onload = function () {
      resolve(img)
    }
    img.onerror = function () {
      reject()
    }
    img.src = src
  })
  return promise
}
var src = ''

var result = loadImg(src)
result.then()
result.then()

二、catch捕获

catch通常用于最后统一捕获,我我们try catch一样

Error和eject都可以捕获

result.then(function(img){
      // dosomthing
    }).then(function(){
      // dosomthing
    }).catch(function(error){
      console.log(error)
    })

三、多个串联

如果我们希望我们的需求按顺序加载(例如,先加载用户信息,然后再通过用户信息渲染好友列表之类的)
我们需要在.then之后return 另外一个Promise 就可以了

var src1 = 'www.xxx.com/1.jpg'
var src2 = 'www.xxx.com/2.jpg'
var img1 = loadImg(src1)
var img2 = loadImg(src2)

//链式操作
img1.then(function(img){
  console.log('图片一加载完成', img)
  return img2 //接下来就是对img2进行异步操作了
}).then(function(img){
  console.log('图片二加载完成', img)
}).catch(function(er){
  console.log(er)
})

四、Promise.all

Promise.all 接收一个Promose对象数组 待全部完成之后 一起执行success。(有点像JS中短路操作的 且&&)

.then方法接收的datas是一个数组,依次包含多个Promise返回值

Promise.all([result1,result2]).then(datas => {
  console.log(datas[0])
  console.log(datas[1])
})

五、Promise.race

和all不一样的是 数组中只要有一个完成 就执行success
(参考JS短路操作的 或||)

Promise.race([result1,result2]).then(data => {
  console.log(data)
})

PromiseStatus 的值,也就是 Promise 的状态,可以是以下三个值之一:
✅ fulfilled: promise 已经被 resolved。一切都很好,在 promise 内部没有错误发生。
❌ rejected: promise 已经被 rejected。哎呦,某些事情出错了。
⏳ pending: promise 暂时还没有被解决也没有被拒绝,仍然处于 pending 状态


1.gif

对于一个 promise,我们可以使用它上面的 3 个方法:

.then(): 在一个 promise 被 resolved 后调用
.catch(): 在一个 promise 被 rejected 后被调用
.finally(): 不论 promise 是被 resolved 还是 reject 总是调用

Promise 总是resolve 或reject 可写Promise.resolve Promise.reject

相关文章

网友评论

      本文标题:2020-08-15 Promise

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