let promise=new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve('123') }) })promise.then(res=>{ console.log(res) },err=>{ })promise.then(res=>{ console.log(res) },err=>{ }).then(res=>{ console.log(res) },err=>{ })
执行顺序
let promise=new Promise((resolve,reject)=>{ resolve('123') console.log(1) })promise.then(res=>{ console.log(res) },err=>{ })
值的穿透
promise.then().then(res=>{ console.log(res) },err=>{ })
then的问题
promise.then(res=>{ return 1 },err=>{ }).then(res=>{ console.log(res) },err=>{ })
注意
promise.then((data) => { return new Promise((resolve,reject)=>{ resolve(new Promise((resolve,reject)=>{ resolve('123456'); })) })}, err => { console.log( err);}).then(res=>{ console.log(res) },err=>{ })
手写promise
class Promise { constructor(executor) { this.status = 'pending'; this.value = undefined; this.reason = undefined; this.onResolvedCallbacks = []; this.onRejectedCallbacks = []; let resolve = (data) => { if (this.status === 'pending') { this.value = data; this.status = 'resolved'; this.onResolvedCallbacks.forEach(fn => fn()); } } let reject = (reason) => { if (this.status === 'pending') { this.reason = reason; this.status = 'rejected'; this.onRejectedCallbacks.forEach(fn => fn()); } } try { executor(resolve, reject); } catch (e) { reject(e); } } then(onFulFilled, onRejected) { onFulFilled = typeof onFulFilled === 'function' ? onFulFilled : y => y; onRejected = typeof onRejected === 'function' ? onRejected : err => { throw err; }; let promise2; if (this.status === 'resolved') { promise2 = new Promise((resolve, reject) => { setTimeout(() => { try { let x = onFulFilled(this.value); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); } if (this.status === 'rejected') { promise2 = new Promise((resolve, reject) => { setTimeout(() => { try { let x = onRejected(this.reason); resolvePromise(promise2, x, resolve, reject) } catch (e) { reject(e); } }, 0); }); } if (this.status === 'pending') { promise2 = new Promise((resolve, reject) => { this.onResolvedCallbacks.push(() => { setTimeout(() => { try { let x = onFulFilled(this.value); resolvePromise(promise2, x, resolve, reject) } catch (e) { reject(e); } }, 0) }); this.onRejectedCallbacks.push(() => { setTimeout(() => { try { let x = onRejected(this.reason); resolvePromise(promise2, x, resolve, reject); } catch (e) { reject(e); } }, 0); }); }) } return promise2; }}function resolvePromise(promise2, x, resolve, reject) { if (promise2 === x) { return reject(new TypeError('循环引用')); } if (x !== null && (typeof x === 'object' || typeof x === 'function')) { let called; try { let then = x.then; if (typeof then === 'function') { then.call(x, y => { if (called) return;