Promise
异步操作的同步表现形式
优点
1.解决回调地狱(Callback Hell)问题
2.由于栈信息不同 无法try catch return throw。解决无法捕获异常或异常捕获不可控
简介
Promise的构造函数接收一个参数,是函数,并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数。其实这里用“成功”和“失败”来描述并不准确,按照标准来讲,resolve是将Promise的状态置为fullfiled,reject是将Promise的状态置为rejected。
Promise的优势在于,可以在then方法中继续写Promise对象并返回,然后继续调用then来进行回调操作。
Promise的精髓是“状态”,用维护状态、传递状态的方式来使得回调函数能够及时调用,它比传递callback函数要简单、灵活的多
然后回到开头的代码。因为settimeout是宏任务,虽然先执行的他,但是他被放到了宏任务的eventqueue里面,然后代码继续往下检查看有没有微任务,检测到Promise的then函数把他放入了微任务序列。等到主线进程的所有代码执行结束后。先从微任务queue里拿回掉函数,然后微任务queue空了后再从宏任务的queue拿函数。
宏任务一般是:包括整体代码script,setTimeout,setInterval。
微任务:Promise,process.nextTick。
Promise是什么
按照用途解释:
1.主要用于异步计算
2.可以将一步操作队列化,按照期望的顺序执行,返回符合预期的结果
3.可以在对象之间传递和操作Promise,帮助我们处理队列
Promise产生的原因:
1.js为检查表单而生
2.创造它的首要目标是为了操作DOM
3.所以js很多操作都是异步的
异步回调的缺点:
1.原函数与异步回调函数在不同栈内运行,异步回调函数无法获取原函数栈的信息,原函数也无法捕获异步回调函数抛出的错误。异步回调无法正常使用try catch(无法正常检索堆栈信息)
2.由于异步,我们可能无法判断何时完成的,所以在高级作用域/外层作用域声明很多变量以便于内层修改,这些变量有可能被其他的函数访问和修改,最终出现错误
3.嵌套层次很深
4.无法正常使用return和throw
5.多个回调之间无法建立联系
function MyPromise (fn) {
console.info('1');
let self = this;
// 用来保存 then 传入的回调函数
this.callback = u = undefined;
console.info('2');
function resolve (val) {
console.info('3');
setTimeout(function(){
console.info('执行callback');
self.callback && self.callback(val);
})
console.info('4');
return self;
}
console.info('5');
fn(resolve);
console.info('6');
}
MyPromise.prototype.then = f = function (next) {
console.info('7');
this.callback = next;
console.info('8');
};
let a = new MyPromise((resolve) => {
console.info('9');
resolve('gehehehe')
console.info('10')
}).then((value) => {
console.info('---',value) })