1.基础知识/构造函数中的函数只执行一次,then方法可以多次调用
const promise = new Promise((resolve,reject) => {
setTimeout(() => {
console.log('1')
resolve('2')
},1000)
})
promise.then((res) => {
cons.left(res)
})
promise.then((res) => {
cons.left(res)
})
//1 2 2
2.快手真题
题目:使用promise手写延迟器,在执行函数之后2秒后打印1
function sleep(time) {
// 请写出你的代码
}
sleep(2000).then(() => {
console.log(1)
})
// 解
return new Promise((resolve,reject) => {
setTimeout(() => {
resolve()
},time)
// })
3.深信服真题
注:为了保证链式调用的正常运行。上一个promise返回的结果(不管成功还是失败)都会传递给下一个promise作为它成功时候的回调
Promise.resolve().then(() => {
return new Error('报错了')
}).then(res => {
cons.left("之后",res)
}).catch(err => {
cons.left("catch:",err)
})
// 之后 Error: 报错了
4.手撕promise
注: 1.架构 => status,value,reason,resolve(),reject()
2.异步是怎么实现的
3.链式调用时怎么实现的
// 1.基本结构
function myPromise(excutor) {
let self = this;
self.stateus = 'pending';
// 状态
self.value = null;
// 成功的结果
self.reason = null;
// 失败的理由
}
self.onFulfilledCallbacks = [];
self.onRejectedCallbacks =[];
// 成功的回调
function resolve(value) {
// 4.状态该表的后续处理
if(self.status === 'pending') {
self.value = value;
self.status = 'fulfilled';
// 状态改变,依次取出
self.onFulfilledCallbacks.forEach(item => item(value))
}
}
// 失败的回调
function reject(reason) {
if(self.status === 'pending');
self.reason = reason;
self.status = 'rejected';
self.onRejectedCallbacks.forEach(item => item(reason))
}
// 2.先执行
try{
excutor(resolve,reject)
}catch(err) {
reject(err)
}
// 3. .then方法()
myPromise.prototype.then = function(onFulfilled,onRejected) {
// 容错处理
onFulfilled = typeof onFulfilled === 'function' ?
onFulfilled : function (data) {resolve(data)}
onRejected = typeof onRejected === 'function' ?
onRejected : function(err) {throw err}
//使promise支持异步-----发布订阅模式
//pending
let self = this
if(this.status === 'pending') {
self.onFulfilledCallbacks.push(onFulfilled);
self.onRejectedCallbacks.push(onRejected)
}
console.log(this.status)
}
let demo = new myPromise((resolve,reject) => {
console.log('hello')
setTimeout(() => {
//异步执行
resolve(1)
},1000)
})
demo.then(data => console.log(data))