听到周围说面试中 promise 被问到的概率在98%以上 之前谈谈promise 写过 今天在卖弄一个题型
首要说的状态
Promise的三种状态 Pending进行中 Resolved已成功 Rejected已失败
Pending 到 Resolved
pending 到 Rejected
一旦建立就会立即执行 无法中途取消
不设置回调 内部抛出的错误不会反应到外例子
function loadUserInfo(id) {
return new Promise(function (resolve, reject){
http.get(XXX, function(data) {
resolve(data)
})
})
}
loadUserInfo (id).then(function(data){
//成功
},function(err){
//失败
})复制代码
then 方法接受两个函数的参数 第一个是成功的回调 第二个是错误的回调
- 面试题(自个扩展的)
window.onload = function() {
setTimeout(function(){
console.log(1)
},0)
var issuccess = true
var promise =new Promise(function(resolve, reject){
console.log(2)
if (issuccess) {
resolve(console.log("成功"))
} else{
reject(console.log("错误"))
}
console.log(3)
})
promise.then(function(){
console.log(4)
}, function(){
console.log(5)
})
console.log(6)
}复制代码
问 最后输出什么
答案在下面 我来卖弄下这里的细节
- 普及下异步 事件
js是一个单线程的 也就是说一个时间点上只能做一件事情
为啥不是多线程那 像Java那样 (网上加个人 见解) js作为浏览器脚本语言 主要是来根据跟用户的操作来操作dom 假如说多线程 第一个线程在dom上添加 第二线程在dom上删除 浏览器不知道依谁为主 所以这就是想JavaScript这样的脚本语言不能搞成多线程一原因吧但是如果有很多操作 单线程一个不好的地方就是 要等上一个事情处理完才可以处理这个事情 导致性能 加载等等慢的很多 这个时候要实现异步操作 可是单线程如果搞那
- js的异步是通过回调函数来实现的 (线程+任务队列) 线程主完成主要操作(同步的事情) 线程ok以后开始轮训任务队列 通过回调取出来执行
总结下 开始执行 1. 线程上执行所以操作(同步) 2.线程外开辟一个任务队列 只要异步任务有了结果就在任务队列中放置一个事件 3. 线程上ok后 系统会自动读取任务队列里面事件 4. 线程重复上面
- promise 任务队列执行优先级
es6中新增了一个Promise 在事件循环上 每次循环时候 先去es6Promsie 队列中是否有任务执行 Promise 队列优先高 也就是说线程ok了 去执行队列栈中取出事件 上来Promise任务会首先执行 其他就没有优先级
看看上面那道题吧
线程开始执行操作(同步)
任务队列中 Promise有 优先级
setTimeout 加入任务队列- 打印是 2 //没毛病吧 因为属于主操作
- 打印是 成功 //没毛病
- 打印是 3 //没毛病
- 打印是 6 // .then 的回调在任务队列上
线程上ok了 现在是任务队列上的了 - 打印是 4 //上面说了Promise有优先级
- 打印是 1 //任务队列中最后