为什么promise出现 解决异步回掉问题 以下情况是如果不要promise12345678910111213141516// ajaxfunction getData(url, data, callback) { $.ajax({ type: 'GET', url: url, data: data success: function(res) { $.ajax({ ... $.ajax({ ... }) }) } })} promise写法, 链式调用1234567891011121314151617function getData(url, data) { return new Promise((resolve, reject) => { $.ajax({ type: 'GET', url: url, data: data, success: function(res) { resolve(res) }, fail: function(err) { reject(res) } }) })}getData(url, data).then(res => {}) promise三种状态 pending, 等待 fulfilled, 拿result, resolve() rejected, 拿error, reject() promise规范 promise内部一定又一个函数会在传入参数后立即执行 所以我们模拟这个过程,并将三种状态的变化带上1234567891011121314151617181920212223242526272829303132333435363738394041424344454647function Promise(executor) { let _this = this _this.status = 'pending' function resolve(fn) { if(_this.status === 'pending') { _this.onResolved.forEach(fn => fn()) // 链式操作需要 _this.status = 'fulfilled' } } function reject() { if(_this.status === 'pending') { _this.onResolved.forEach(fn => fn()) // 链式操作需要 _this.status = 'rejected' } } // 异常处理 try { executor(resolve, reject) } catch (err) { reject(err) }}// 为Promise添加`.then`方法Promise.prototype.then = function(onfulfiled, onrejected) { // 入餐处理 onfulfiled = typeof onfulfiled === 'function' ? onfulfiled : res => res onrejected = typeof onrejected === 'function' ? onrejected : err => {throw err} let _this = this let promise = new Promise((reslove, reject) => { switch (_this.status) { case 'fulfiled': onfulfiled(res) break case 'rejected': onrejected(err) break default: _this.Promise(promise) break } }) return promise} 未完.(待续) Author: inpm.cy@gmail.com Link: https://inpm.top/2019/03/16/promise/ Copyright: All articles in this blog are licensed under inpm unless stating additionally.< PreviousPost你永运不会准备好,so Just do it!NextPost >归家
为什么promise出现 解决异步回掉问题 以下情况是如果不要promise12345678910111213141516// ajaxfunction getData(url, data, callback) { $.ajax({ type: 'GET', url: url, data: data success: function(res) { $.ajax({ ... $.ajax({ ... }) }) } })} promise写法, 链式调用1234567891011121314151617function getData(url, data) { return new Promise((resolve, reject) => { $.ajax({ type: 'GET', url: url, data: data, success: function(res) { resolve(res) }, fail: function(err) { reject(res) } }) })}getData(url, data).then(res => {}) promise三种状态 pending, 等待 fulfilled, 拿result, resolve() rejected, 拿error, reject() promise规范 promise内部一定又一个函数会在传入参数后立即执行 所以我们模拟这个过程,并将三种状态的变化带上1234567891011121314151617181920212223242526272829303132333435363738394041424344454647function Promise(executor) { let _this = this _this.status = 'pending' function resolve(fn) { if(_this.status === 'pending') { _this.onResolved.forEach(fn => fn()) // 链式操作需要 _this.status = 'fulfilled' } } function reject() { if(_this.status === 'pending') { _this.onResolved.forEach(fn => fn()) // 链式操作需要 _this.status = 'rejected' } } // 异常处理 try { executor(resolve, reject) } catch (err) { reject(err) }}// 为Promise添加`.then`方法Promise.prototype.then = function(onfulfiled, onrejected) { // 入餐处理 onfulfiled = typeof onfulfiled === 'function' ? onfulfiled : res => res onrejected = typeof onrejected === 'function' ? onrejected : err => {throw err} let _this = this let promise = new Promise((reslove, reject) => { switch (_this.status) { case 'fulfiled': onfulfiled(res) break case 'rejected': onrejected(err) break default: _this.Promise(promise) break } }) return promise} 未完.(待续)