Promise之我见

2018-07-26  本文已影响0人  lzyup

Promise之我见

1、Promise的含义

2、Promise的基本用法

let p = new Promise((resolve, reject) => {
  // 做一些事情
  // 然后在某些条件下resolve,或者reject
  if (/* 条件随便写^_^ */) {
    resolve()
  } else {
    reject()
  }
})

p.then(() => {
    // 如果p的状态被resolve了,就进入这里
}, () => {
    // 如果p的状态被reject
})

这里解释一下,Promise构造函数接受一个函数作为参数,resolve和reject是这个函数的两个参数。

3、Promise链式调用

下面分别是三个Promise
function testPromise1(){
    let p = new Promise(function(resolve,reject){
    setTimeout(function(){
        console.log("第一个Promise");
        resolve("数据111");
},1000)
});
return p;
}

function testPromise2(){
    let p = new Promise(function(resolve,reject){
    setTimeout(function(){
        console.log("第二个Promise");
        resolve("数据222");
},1000)
});
return p;
}

function testPromise3(){
    let p = new Promise(function(resolve,reject){
    setTimeout(function(){
        console.log("第三个Promise");
        resolve("数据333");
},1000)
});
return p;
}


接着链式调用
testPromise1()
    .then(function(data){
        console.log(data);
        return testPromise2();
})
.then(function(data){
    console.log(data);
    return testPromise3();
})
.then(function(data){
    console.log(data);
})

输出的结果为:
    第一个Promise
    数据111
    第二个Promise
    数据222
    第三个Promise
    数据333

不难发现,在每个then方法中都返回了一个新的Promise,通过调用新的Promisethen方法从而实现链式调用。

Promise.resolve()
  .then(() => {
    return new Error('error!!!')
  })
  .then((res) => {
    console.log('then: ', res)
  })
  .catch((err) => {
    console.log('catch: ', err)
  })

输出的结果为
``
then: Error: error!!!
    at Promise.resolve.then (...)
    at ...

4、 Promise.then

5 、Promise.catch

// bad
promise
  .then(function(data) {
    // success
  }, function(err) {
    // error
  });

// good
promise
  .then(function(data) { //cb
    // success
  })
  .catch(function(err) {
    // error
  });

一般来说,第二种写法是好于第一种写法,理由是第二种写法可以捕获前面then方法执行中的错误,也更接近同步的写法(try/catch)。因此,建议总是使用catch方法,而不使用then方法的第二个参数。用Promise链式调用的时候也只用在最后加一个catch用来捕获错误即可。

6 、Promise.all的使用

Promise.all方法接受一个数组作为参数,包装成一个新的Promise实例。
例如

Promise
.all([testPromise1(),testPromise2(),testPromise3()])
.then(function(results){
})

7、 Promise.race的用法

上一篇下一篇

猜你喜欢

热点阅读