近来参加校招笔试,发现有好几道关于Promise的题目。然而我都没有了解过。因此,这篇文章以网易笔试的一道题开始,记录关于Promise的那些事。
文章地址:http://lsxj615.com/2016/08/04...promise
console.log(1); new Promise(function (resolve, reject){ reject(true); window.setTimeout(function (){ resolve(false); }, 0); }).then(function(){ console.log(2); }, function(){ console.log(3); }); console.log(4);
请问输出结果是什么?在揭晓答案以前,咱们仍是先来了解一下Promise吧。异步
Promise 对象用于异步(asynchronous)计算.。一个Promise对象表明着一个还未完成,但预期未来会完成的操做。
Promise 对象是一个返回值的代理,这个返回值在promise对象建立时未必已知。它容许你为异步操做的成功或失败指定处理方法。 这使得异步方法能够像同步方法那样返回值:异步方法会返回一个包含了原返回值的 promise 对象来替代原返回值。async
使用new
来调用Promise
的构造器进行实例化函数
var promise = new Promise(function(resolve, reject){ //异步处理 //处理结束后,调用resolve或reject });
对经过new生成的promise对象为了设置其在resolve(成功)/reject(失败)时调用的回调函数可使用promise.then()
实例方法spa
promise.then(onFulfilled, onRejected); //以防误解,上述的即为如下这种形式 promise.then(function(){...}, function(){...});
当resolve(成功)时,会调用onFulfilled
函数;
reject(失败)时,会调用onRejected
函数。
这也对应了前面笔试题中,onFulfilled
其实就是console.log(2)
,也就是说成功时会调用console.log(2)
,而失败时,onRejected
就是调用console.log(3)
。代理
若只想处理异常状况的函数,可promise.then(undefined, onRejected)
,固然更好的选择是用promise.catch()
来处理。两者效果相同。code
promise.then(function (value) { console.log(value); }).catch(function (error) { console.log(error); }); //等同于如下形式 promise.then(function (value) { console.log(value); }, function (error) { console.log(error); });
Promise.all()
对象
Promise.race()
ip
Promise.resolve()
ci
Promise.reject()
Promise对象有三种状态
pending 初始状态,既不是fulfilled也不是rejected
fulfilled 成功。此时调用onFulfilled
rejected 失败。此时调用onRejected
Fulfilled和Rejected均可以表示为Settled
。
由下图能够了解,最初Promise为pending
状态,在执行后转为settled
状态,而settled
状态分为两种:在成功后转为fulfilled
,执行.then(onFulfilled)
方法;在失败后转为reject
,执行.then(onRejecttion)
或.catch(onRejecttion)
,进行异步操做,再返回Promise对象,转为pending
状态。
Promise.resolve
& Promise.reject
Promise.resolve(value)
可认为是new Promise()
方法的快捷方式
Promise.value(value); //等同于如下代码 new Promise(function(resolve){ resolve(value); });
此时这个promise对象会进入fulfilled
状态。而resolve(value)
中的value
会传递给后面then
中指定的onFulfilled
函数。
Promise.resolve(value)
返回值也是一个promise对象,因此能够进行链式调用.
Promise.reject(error)
与上述静态方法相似,也是new Promise()
方法的快捷方式
Promise.reject(new Error("出错了")); //等同于如下代码 new Promise(function(resolve, reject){ reject(new Error("出错了")); });
这段代码则是调用该promise对象经过then
指定的onRejected
函数,并将错误对象(Error)传递给onRejected
函数。
话很少说,贴图就是。
能够知道,当promise调用了reject(true)
方法,则传递true
这个参数给'then'指定的onRejected
函数,即题目中的function(){console.log(3);}
。但因为.then
中指定的方法调用是异步执行的,因此会先执行console.log(4);
本篇文章仅是简单介绍promise。欲了解更多内容,可查看如下资料。谢谢~
资料来源: