一、 Promise是一个构造函数,它接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。不过按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。它本身有all、reject、resolve这几个的方法,原型上有then、catch、race等的方法,下面为大家详细介绍其用法。
1 | var p = new Promise(function(resolve, reject){ |
二、在上面的代码中,执行了一个异步操作,1秒之后,输出“执行完成”,并且调用resolve方法。看到这里,你可能会注意到,我们并没有调用函数,Promise自动进行了执行,所以我们一般把Promise放到函数里面,示例如下:
1 | function run(){ |
then方法
在函数最后,会return出Promise对象,然后我们就可以调用它的then方法:
1
2
3
run().then(function(data){
console.log(data);
});
在run()的返回上直接调用then方法,then接收一个参数,是函数,并且会拿到我们在runAsync中调用resolve时传的的参数。运行这段代码,会在2秒后输出“执行完成”,紧接着输出“随便什么数据”。这时我们就会明白,then里面的函数就跟我们平时的回调函数一个意思,能够在run这个异步任务执行完成之后被执行。这就是Promise的作用了,简单来讲,就是能把原来的回调写法分离出来,在异步操作执行完后,用链式调用的方式执行回调函数。你可能会想,我写个回调函数不是照样能实现Promise函数的功能吗,但是如果是多次回调,你就会发现callback回调不能满足我们的需求了,而then方法可以进行链式操作,很好地解决了回调地狱的问题。
链式操作的用法
1 | function run(){ |
运行之后,每隔两秒输出每个异步回调中的内容,在runAsync2中传给resolve的数据,能在接下来的then方法中拿到。运行结果如下:
执行完成
随便什么数据
执行完成
随便什么数据
执行完成
随便什么数据
你也可以直接return “hello world”,会输出hello world,但其后面不能继续使用then方法。
reject的用法
上面的例子都是“执行成功”的resolve回调,下面我们来看一下reject的用法:
`
function getNum(){
var p = new Promise(function(resolve, reject){
setTimeout(function(){
var num = Math.ceil(Math.random()*10);
i