关于promise 发表于 2020-08-19 | 分类于 JavaScript | | promise实现以下为手写promise,实现的比较粗略promise作为构造函数实现 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>promise的实现</title></head><body><script> // let a = new Promise((resolve, reject) => { // console.log(123); // setTimeout(function () { // resolve('hhh') // }, 0) // // }); // a.then(res => { // console.log(1233); // console.log(res) // }, rej => { // console.log(rej) // }) // Promise.all([1,2,3]).then(val => { // console.log(val) // }) // Promise.race([1,2,3]).then(val => { // console.log(val) // }) console.log('----------------------'); function promise(executor) { let self = this; self.status = 'pending'; self.data = null; self.callbacks = {}; function resolve(data) { if (self.status !== 'pending') return; self.status = 'resolved'; self.data = data; if (self.callbacks.onResolved) { self.callbacks.onResolved(data) } } function reject(data) { if (self.status !== 'pending') return; self.status = 'rejected'; self.data = data; if (self.callbacks.onRejected) { self.callbacks.onRejected(data) } } executor(resolve, reject) } promise.prototype.then = function(onResolved, onRejected) { let self = this; onResolved = typeof onResolved === 'function' ? onResolved : value => value; onRejected = typeof onRejected === 'function' ? onRejected : reason => {throw reason}; if (self.status === 'resolved') { queueMicrotask(() => { handle(onResolved) }) } else if (self.status === 'rejected') { queueMicrotask(() => { handle(onRejected) }) } else if (self.status === 'pending') { self.callbacks = { onResolved: () => { queueMicrotask(() => { handle(onResolved) }) }, onRejected: () => { queueMicrotask(() => { handle(onRejected) }) } } } function handle(callback) { return new promise((resolve, reject) => { resolve(callback(self.data)) }) } }; promise.resolve = function(val) { return new promise(resolve => { resolve(val) }) } promise.race = function (args) { return new promise((resolve, reject) => { args.forEach(item => { promise.resolve(item).then(val => { resolve(val) }, val => { reject(val) }) }) }) }; promise.all = function (args) { let results = []; let num = 0; let total = args.length return new promise((resolve, reject) => { args.forEach((item, index) => { promise.resolve(item).then(val => { results[index] = val; num++; if (num === total) { resolve(results) } }, val => { reject(val) }) }) }) }; let b = new promise((resolve, reject) => { console.log(123) setTimeout(function () { resolve('hhh') }, 0) }); b.then(res => { console.log(222); console.log(res) }); promise.race(['r','a','c', 'e']).then(val => { console.log(val) }) promise.all(['a','l','l']).then(val => { console.log(val) })</script></body></html> 参考实现方式 promise A+ 规范 promise面试题