Promise.prototype.then/catch
Promise.prototype.then / Promise.prototype.catchfunction getIp() {var promise = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest()xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getIp', true)xhr.onload = function(){var retJson = JSON.parse(xhr.responseText) // {"ip":"58.100.211.137"}resolve(retJson.ip)}xhr.onerror = function(){reject('获取IP失败')}xhr.send()})return promise}function getCityFromIp(ip) {var promise = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest()xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getCityFromIp?ip='+ip, true)xhr.onload = function(){var retJson = JSON.parse(xhr.responseText) // {"city": "hangzhou","ip": "23.45.12.34"}resolve(retJson.city)}xhr.onerror = function(){reject('获取city失败')}xhr.send()})return promise}function getWeatherFromCity(city) {var promise = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest()xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getWeatherFromCity?city='+city, true)xhr.onload = function(){var retJson = JSON.parse(xhr.responseText) //{"weather": "晴天","city": "beijing"}resolve(retJson)}xhr.onerror = function(){reject('获取天气失败')}xhr.send()})return promise}getIp().then(function(ip){return getCityFromIp(ip)}).then(function(city){return getWeatherFromCity(city)}).then(function(data){console.log(data)}).catch(function(e){console.log('出现了错误', e)})
Promise一个构造函数,.then和.catch方法都在prototype上
Promise.all
function getCityFromIp(ip) {var promise = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest()xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getCityFromIp?ip='+ip, true)xhr.onload = function(){var retJson = JSON.parse(xhr.responseText) // {"city": "hangzhou","ip": "23.45.12.34"}resolve(retJson)}xhr.onerror = function(){reject('获取city失败')}xhr.send()})return promise}var p1 = getCityFromIp('10.10.10.1')var p2 = getCityFromIp('10.10.10.2')var p3 = getCityFromIp('10.10.10.3')//Promise.all, 当所有的 Promise 对象都完成后再执行Promise.all([p1, p2, p3]).then(data=>{console.log(data)})
当所有promise都settle, 全都resolved则执行.then第一个回调函数,返回所有结果组成的数组,只要有一个rejected, 则执行第二个回调函数
Promise.race
function getCityFromIp(ip) {var promise = new Promise(function(resolve, reject){var xhr = new XMLHttpRequest()xhr.open('GET', 'https://easy-mock.com/mock/5ac2f80c3d211137b3f2843a/promise/getCityFromIp?ip='+ip, true)xhr.onload = function(){var retJson = JSON.parse(xhr.responseText) // {"city": "hangzhou","ip": "23.45.12.34"}resolve(retJson)}xhr.onerror = function(){reject('获取city失败')}setTimeout(()=>{xhr.send()}, Math.random()*1000)})return promise}var p1 = getCityFromIp('10.10.10.1')var p2 = getCityFromIp('10.10.10.2')var p3 = getCityFromIp('10.10.10.3')//Promise.all, 当所有的 Promise 对象都完成后再执行Promise.race([p1, p2, p3]).then(data=>{console.log(data)})
只要有一个settle, resolved则执行.then第一个回调函数,rejected则执行第二个回调函数
function fn1() {return new Promise((resolve, reject)=>{setTimeout(()=>{console.log('fn1...')resolve()}, 1000)})}function fn2() {return new Promise((resolve, reject)=>{setTimeout(()=>{console.log('fn2...')resolve()}, 1000)})}function fn3() {return new Promise((resolve, reject)=>{setTimeout(()=>{console.log('fn3...')resolve()}, 1000)})}function onerror() {console.log('error')}fn1().then(fn2).then(fn3).catch(onerror)
