html+css
, 而是html+css+js
,可是想學好js首先要知道js的核心在於異步,說到異步大部分人第一時間會想到Promise
。const p = new Promise((resolve,reject)=>{ resolve('返回成功的值') reject('返回失敗的值') }) p.then(value=>{ console.log(value) // 返回成功的值 })
(function(window){ // 定義MyPromise構造函數 function MyPromise(executor){ function resolve(value){ } function reject(reason){ } executor(resolve,reject) } // MyPromise原型鏈上存在then方法 MyPromise.prototype.then = function(onResolved,onRejected){ } //MyPromise原型鏈上存在catch方法 MyPromise.prototype.catch = function(onRejected){ } //MyPromise實例對象上存在resolve方法 MyPromise.resolve = function(value){ } //MyPromise實例對象上存在reject方法 MyPromise.reject = function(reason){ } //MyPromise實例對象上存在all方法 MyPromise.all = function(promises){ } //MyPromise實例對象上存在race方法 MyPromise.race = function(promises){ } window.MyPromise = MyPromise; })(window)
(function(window){ const PENDDING = 'pendding'; const FULFILLED = 'fulfilled'; const REJECTED = 'rejected'; function MyPromise(executor){ const self = this; self.status = PENDDING; //初始狀態 self.data = undefined; // 初始值 self.callbacks = []; // 待執行異步回調函數的數組 function resolve(value){ } function reject(reason){ } executor(resolve,reject) } window.MyPromise = MyPromise; })(window)
(function (window) { const PENDDING = 'pendding'; const FULFILLED = 'fulfilled'; const REJECTED = 'rejected'; // 定義MyPromise function MyPromise(executor) { const self = this; self.status = PENDDING; self.data = undefined; self.callbacks = []; function resolve(value) { self.status = FULFILLED; self.data = value; // 當即執行異步回調函數 setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onResolved(value); }) }) } function reject(reason) { self.status = REJECTED; self.data = reason; setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onRejected(reason); }) }) } executor(resolve, reject) } window.MyPromise = MyPromise;
(function (window) { const PENDDING = 'pendding'; const FULFILLED = 'fulfilled'; const REJECTED = 'rejected'; // 定義MyPromise function MyPromise(executor) { const self = this; self.status = PENDDING; self.data = undefined; self.callbacks = []; function resolve(value) { if (self.status !== PENDDING) return; self.status = FULFILLED; self.data = value; // 當即執行異步回調函數 setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onResolved(value); }) }) } function reject(reason) { if (self.status !== PENDDING) return; self.status = REJECTED; self.data = reason; setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onRejected(reason); }) }) } executor(resolve, reject) } window.MyPromise = MyPromise;
// MyPromise原型鏈上存在then方法 MyPromise.prototype.then = function (onResolved, onRejected) { const self = this; return new MyPromise((resolve, reject) => { // 每次都返回一個新的Promise對象 // 首先判斷當前狀態 if (self.status === FULFILLED) { /* 一、返回的Promise的結果是由onResolved/onrejected決定的 二、返回的是Promise對象 (根據執結果決定Promise的返回結果) 三、返回的不是Promise對象 (該值就是Promise的返回結果) 四、拋出異常 異常的值爲返回的結果 */ setTimeout(() => { try { const result = onResolved(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } }); } else if (self.status === REJECTED) { setTimeout(() => { try { const result = onRejected(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } }); } else if (self.status === PENDDING) { self.callbacks.push({ onResolved() { try { const result = onResolved(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } }, onRejected() { try { const result = onRejected(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } } }) } }) }
> return new MyPromise((resolve,reject)){}
css
// MyPromise原型鏈上存在then方法 MyPromise.prototype.then = function (onResolved, onRejected) { const self = this; return new MyPromise((resolve, reject) => { // 每次都返回一個新的Promise對象 function handle(callback) { /* 一、返回的Promise的結果是由onResolved/onrejected決定的 二、返回的是Promise對象 (根據執結果決定Promise的返回結果) 三、返回的不是Promise對象 (該值就是Promise的返回結果) 四、拋出異常 異常的值爲返回的結果 */ try { const result = callback(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } } // 首先判斷當前狀態 if (self.status === FULFILLED) { setTimeout(() => { thandle(onResolved) }); } else if (self.status === REJECTED) { setTimeout(() => { thandle(onRejected) }); } else if (self.status === PENDDING) { self.callbacks.push({ onResolved() { handle(onResolved) }, onRejected() { handle(onRejected) } }) } }) }
MyPromise.prototype.then = function (onResolved, onRejected) { const self = this; // 定義默認回調 onResolved = typeof onResolved === "function" ? onResolved : value => value; onRejected = typeof onRejected === "function" ? onRejected : reason => {throw reason}; return new MyPromise((resolve, reject) => { // 每次都返回一個新的Promise對象 function handle(callback) { /* 一、返回的Promise的結果是由onResolved/onrejected決定的 二、返回的是Promise對象 (根據執結果決定Promise的返回結果) 三、返回的不是Promise對象 (該值就是Promise的返回結果) 四、拋出異常 異常的值爲返回的結果 */ try { const result = callback(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } } // 首先判斷當前狀態 if (self.status === FULFILLED) { setTimeout(() => { thandle(onResolved) }); } else if (self.status === REJECTED) { setTimeout(() => { thandle(onRejected) }); } else if (self.status === PENDDING) { self.callbacks.push({ onResolved() { handle(onResolved) }, onRejected() { handle(onRejected) } }) } }) }
Promise.prototype.then(undefined,rejected)
Promise.prototype.then(null,rejected)
//MyPromise原型鏈上存在catch方法 MyPromise.prototype.catch = function (onRejected) { return this.then(null, onRejected); }
/MyPromise實例對象上存在resolve方法 MyPromise.resolve = function (value) { if (value instanceof MyPromise) return value; return new MyPromise(resolve => resolve(value)) // 返回一個resolved狀態的Promise對象 } //MyPromise實例對象上存在reject方法 MyPromise.reject = function (reason) { return new MyPromise((resolve,reject) => reject(reason)); // 返回一個reject狀態Promise對象 }
//MyPromise實例對象上存在all方法 MyPromise.all = function (promises) { let promisesCount = 0 let values = new Array(promises.length); return new MyPromise((resolve,reject)=>{ promises.forEach((promise,index)=>{ promise.then(value => { promisesCount++; values[index] = value; if (promisesCount === promises.length){ resolve(values); } },reason => { reject(reason); }) }) }) }
好的,咱們來看看Promise.all實現的思路html
//MyPromise實例對象上存在all方法 MyPromise.all = function (promises) { let promisesCount = 0 let values = new Array(promises.length); return new MyPromise((resolve, reject) => { promises.forEach((promise, index) => { MyPromise.resolve(promise).then(value => { promisesCount++; values[index] = value; if (promisesCount === promises.length) { resolve(values); } }, reason => { reject(reason); }) }) }) }
//MyPromise實例對象上存在race方法 MyPromise.race = function (promises) { return new MyPromise((resolve, reject) => { promises.forEach(promise => { MyPromise.resolve(promise).then(value => { resolve(value); }, reason => { reject(reason) }) }) }) }
好的,解釋一下,前端
Promise.prototype.thenPromise.prototype.catch數組
Promise.resolvepromise
Promise.reject異步
Promise.all函數
Promise.race學習
(function (window) { const PENDDING = 'pendding'; const FULFILLED = 'fulfilled'; const REJECTED = 'rejected'; // 定義MyPromise function MyPromise(executor) { const self = this; self.status = PENDDING; self.data = undefined; self.callbacks = []; function resolve(value) { if (self.status !== PENDDING) return; self.status = FULFILLED; self.data = value; // 當即執行異步回調函數 setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onResolved(value); }) }) } function reject(reason) { if (self.status !== PENDDING) return; self.status = REJECTED; self.data = reason; setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onRejected(reason); }) }) } try{ executor(resolve, reject) }catch(error){ reject(error) } } // MyPromise原型鏈上存在then方法 MyPromise.prototype.then = function (onResolved, onRejected) { const self = this; // 定義默認回調 onResolved = typeof onResolved === "function" ? onResolved : value => value; onRejected = typeof onRejected === "function" ? onRejected : reason => { throw reason }; return new MyPromise((resolve, reject) => { // 每次都返回一個新的Promise對象 function handle(callback) { /* 一、返回的Promise的結果是由onResolved/onrejected決定的 二、返回的是Promise對象 (根據執結果決定Promise的返回結果) 三、返回的不是Promise對象 (該值就是Promise的返回結果) 四、拋出異常 異常的值爲返回的結果 */ try { const result = callback(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } } // 首先判斷當前狀態 if (self.status === FULFILLED) { setTimeout(() => { handle(onResolved) }); } else if (self.status === REJECTED) { setTimeout(() => { handle(onRejected) }); } else if (self.status === PENDDING) { self.callbacks.push({ onResolved() { handle(onResolved) }, onRejected() { handle(onRejected) } }) } }) } //MyPromise原型鏈上存在catch方法 MyPromise.prototype.catch = function (onRejected) { return this.then(null, onRejected); } //MyPromise實例對象上存在resolve方法 MyPromise.resolve = function (value) { if (value instanceof MyPromise) return value; return new MyPromise(resolve => resolve(value)) // 返回一個resolved狀態的Promise對象 } //MyPromise實例對象上存在reject方法 MyPromise.reject = function (reason) { return new MyPromise((resolve, reject) => reject(reason)); // 返回一個reject狀態Promise對象 } //MyPromise實例對象上存在all方法 MyPromise.all = function (promises) { let promisesCount = 0 let values = new Array(promises.length); return new MyPromise((resolve, reject) => { promises.forEach((promise, index) => { MyPromise.resolve(promise).then(value => { promisesCount++; values[index] = value; if (promisesCount === promises.length) { resolve(values); } }, reason => { reject(reason); }) }) }) } //MyPromise實例對象上存在race方法 MyPromise.race = function (promises) { return new MyPromise((resolve, reject) => { promises.forEach(promise => { MyPromise.resolve(promise).then(value => { resolve(value); }, reason => { reject(reason) }) }) }) } window.MyPromise = MyPromise; })(window)
(function (window) { const PENDDING = 'pendding'; const FULFILLED = 'fulfilled'; const REJECTED = 'rejected'; // 定義MyPromise class MyPromise { constructor(executor) { const self = this; self.status = PENDDING; self.data = undefined; self.callbacks = []; function resolve(value) { if (self.status !== PENDDING) return; self.status = FULFILLED; self.data = value; // 當即執行異步回調函數 setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onResolved(value); }) }) } function reject(reason) { if (self.status !== PENDDING) return; self.status = REJECTED; self.data = reason; setTimeout(() => { self.callbacks.forEach(callbacksObj => { callbacksObj.onRejected(reason); }) }) } executor(resolve, reject) } // MyPromise原型鏈上存在then方法 then(onResolved, onRejected) { const self = this; // 定義默認回調 onResolved = typeof onResolved === "function" ? onResolved : value => value; onRejected = typeof onRejected === "function" ? onRejected : reason => { throw reason }; return new MyPromise((resolve, reject) => { // 每次都返回一個新的Promise對象 function handle(callback) { /* 一、返回的Promise的結果是由onResolved/onrejected決定的 二、返回的是Promise對象 (根據執結果決定Promise的返回結果) 三、返回的不是Promise對象 (該值就是Promise的返回結果) 四、拋出異常 異常的值爲返回的結果 */ try { const result = callback(self.data); if (reject instanceof MyPromise) { result.then(value => { resolve(value); }, reason => { reject(reason); }) } else { resolve(result); } } catch (error) { reject(error); } } // 首先判斷當前狀態 if (self.status === FULFILLED) { setTimeout(() => { handle(onResolved) }); } else if (self.status === REJECTED) { setTimeout(() => { handle(onRejected) }); } else if (self.status === PENDDING) { self.callbacks.push({ onResolved() { handle(onResolved) }, onRejected() { handle(onRejected) } }) } }) } //MyPromise原型鏈上存在catch方法 catch (onRejected) { return this.then(null, onRejected); } //MyPromise實例對象上存在resolve方法 static resolve(value) { if (value instanceof MyPromise) return value; return new MyPromise(resolve => resolve(value)) // 返回一個resolved狀態的Promise對象 } //MyPromise實例對象上存在reject方法 static reject(reason) { return new MyPromise((resolve, reject) => reject(reason)); // 返回一個reject狀態Promise對象 } //MyPromise實例對象上存在all方法 static all(promises) { let promisesCount = 0 let values = new Array(promises.length); return new MyPromise((resolve, reject) => { promises.forEach((promise, index) => { MyPromise.resolve(promise).then(value => { promisesCount++; values[index] = value; if (promisesCount === promises.length) { resolve(values); } }, reason => { reject(reason); }) }) }) } //MyPromise實例對象上存在race方法 static race(promises) { return new MyPromise((resolve, reject) => { promises.forEach(promise => { MyPromise.resolve(promise).then(value => { resolve(value); }, reason => { reject(reason) }) }) }) } } window.MyPromise = MyPromise; })(window)
特皮技術團隊
,有人指導你學習,提高本身,能夠公衆號聯繫我在看
和贊
,轉發一下,關注咱們公衆號:【前端巔峯
】