从JavaScript的事件循环到Promise(2)

同样的道理,在promise中,前面的代码片段会让foo()创建并返回一个Promise实例,而且在这个Promise会被传递到bar()和baz()中。所以本质上,promise就是某个函数返回的对象。你可以把回调函数绑定再这个对象上,而不是把回调函数当成参数传进函数。

const promise = doSomething();
    promsie.then(successCallback,failureCallback){
       
    }

当然啦,promise不像旧式函数将回调函数传递到两个处理函数中,而且会有一个优点:

在JavaScript事件队列的本次tick运行完成之前,回调函数永远不会执行。

通过.then形式添加的回调函数,甚至都在异步操作完成之后才被添加的函数,都会被调用。

通过多次调用.then,可以添加多个回调函数,他们会按照插入顺序并且独立运行。

但是,Promise最直接的好出就是链式调用。

doSomething().then(function(result) {
  return doSomethingElse(result);
})
.then(function(newResult) {
  return doThirdThing(newResult);
})
.then(function(finalResult) {
  console.log('Got the final result: ' + finalResult);
})
.catch(failureCallback);

并且在一个失败操作之后还可以继续使用链式操作,即使链式中的一个动作失败之后还能有助于新的动作继续完成。

在调用Promise中的resolve()和reject()函数时如果带有参数,那么他们的参数会被传递给回调函数。

Promise.resolve()和Promise.reject()是手动创建一个已经resolve或者reject的promise快捷方法。通常,我们可以使用Promise.resolve()去链式调用一个由异步函数组成的数组。例如:

Promise.resolve().then(func1).then(func2);

Promise.all()和Promise。race()是并行运行异步操作的两个组合式工具。

Promise.then()方法用来分别指定resolved状态和rejected状态的回调函数。传递到then中的函数被置入了一个微任务队列,而不是立即执行,这意味着它是在JavaScript事件队列的所有运行结束了,事件队列被清空之后才开始执行

let promise = new Promise(function(resolve, reject) {
  console.log('Promise');
  resolve();
});

promise.then(function() {
  console.log('resolved.');
});

console.log('Hi!');

// Promise
// Hi!
// resolved

Promise.then()方法返回一个Promise,它最多需要有两个参数:Promise的成功和失败情况的回调函数。

p.then(onFulfilled, onRejected);

p.then(function(value) {
  // fulfillment
  }, function(reason) {
  // rejection
});

onFulfilled:当Promise变成接受状态(fulfillment)时,该参数作为回调函数被调用。该函数有一个参数,即接受的值。

onRejected:当Promise变成拒绝状态时,该参数作为回调函数被调用。该函数有一个参数,即拒绝的原因。

Promise的状态一旦改变,就永久保持该状态,不会再改变了。

Promise中的错误处理

一般的情况,我们会在每次的Promise中抛出错误,在Promise中的then函数中的rejected处理函数会被调用,这是我们作为错误处理的常用方法:

let p = new Promise(function(resolve,reject){
        reject('error');
    });
   
    p.then(function(value){
        success(value);
    },function(error){
        error(error) 
    }
)

但是一种更好的方式是使用catch函数,这样可以处理Promise内部发生的错误,catch方法返回的还是一个Promise对象,后边还可以接着调用then方法。而且catch方法尽量写在链式调用的最后一个,避免后边的then方法的错误无法捕获。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/e5cd761c5858841a2b4f70db7b452397.html