标签:tor his 地狱 相关 oop 注册 失败 tca 回调函数
由于JS是单线程语言,因此所有网络操作、浏览器事件都必须是异步执行的。
浏览器解释执行js代码过程中,遇到异步任务,首先在系统中挂起(异步队列中注册回调函数),当异步任务(eg:I/O,网络请求等操作完成之后),通过触发回调函数的方式完成整个异步操作。
回调方式,代码嵌套层次深,易读性差,且不易维护
ajax请求
thenable对象:具有特定格式then属性的对象
** 因此,Promise最直接的好处是链式调用
console.log('程序开始执行')
new Promise((resolve)=>{
setTimeout(()=>{
resolve()
},200)
})
.then(()=>{
console.log('then_1开始执行')
reject('then_1中执行了reject方法')
})
.then(()=>{
console.log('then_2开始执行')
})
.catch((err)=>{
console.log('I catch' + err)
})
.then(()=>{
console.log('then_3开始执行')
})
.catch((err)=>{
console.log('最终err未执行')
})
输出结果:
程序开始执行
then_1开始执行
I catch then_1中执行了reject方法
then_3开始执行
// 包装不支持Promise语法的函数
new Promise()
// 所有Promise任务执行完成才能执行then
// Promise对象组成的数组作为参数
Promise.all()
// 只要有其中一项完成,即可执行then
Promise.race()
// 手动创建一个resolve的Promise
Promise.resolve()
// 手动创建一个reject的Promise
Promise.reject()
Promise.prototype.then()
Promise.prototype.catch()
Promise.prototype.finally()
const PENDING = 'pending'; //初始状态
const FULFILLED = 'fulfilled'; // 成功状态
const REJECTED = 'rejected'; // 成功
function Promise(extutor){
let self = this;
self.status = PENDING; // 设置状态
// 存放成功回调的数组
self.onResolveCallbacks = [];
// 存放失败回调的数组
self.onRejectedCallbacks = [];
function resolve(value){
if(self.status === PENDING){
self.status = FULFILLED;
self.value = value;
self.onResolveCallbacks.forEach(cb => cd(self.value))
}
}
function reject(reason){
if(self.status === PENDING){
self.status = REJECTED;
self.value = reason;
self.onRejectCallbacks.forEach(cb => cd(self.value))
}
}
try{
excutor(resolve, reject)
} catch(e) {
reject(e)
}
}
标签:tor his 地狱 相关 oop 注册 失败 tca 回调函数
原文地址:https://www.cnblogs.com/nanhuaqiushui/p/11774274.html