ES6之Promise对象
创建Promise对象
function getHtml(url) { return new Promise((resolve, reject) => { let xhr = new XMLHttpRequest(); xhr.open('GET', url); xhr.onload = () => { resolve(xhr.responseText); }; xhr.onerror = () => { reject(xhr.statusText) }; xhr.send(); } ); } function getTitle(html){ return html.substring(html.indexOf('<title>')+7,html.indexOf('</title>')); }
执行单个Promise
getHtml('http://www.baidu.com')
.then(
data => {
console.log('[请求成功]' , getTitle(data));
},
status => {
console.log('[请求失败]', status);
}
).catch(e => {
console.log('[异常]', e);
});
Safari运行效果 ( 停用跨域限制 )
![]()
执行多个Promise
Promise.all([ getHtml('http://www.baidu.com'), getHtml('http://www.sogou.com'), Promise.resolve('Yahoo') ]) .then( datas => { console.log('[请求成功]', getTitle(datas[0])); console.log('[请求成功]', getTitle(datas[1])); console.log('[请求成功]', datas[2]); }, status => { console.log('[请求失败]', status); } ).catch(e => { console.log('[异常]', e); });
Safari运行效果 ( 停用跨域限制 )

链式调用
在then方法的resolve/reject参数中返回Promise对象,实现Promise的链式调用。
getHtml('https://www.baidu.com')
.then(
val=>{
console.log(getTitle(val));
return getHtml('https://www.sogou.com'); // 返回Promise对象
}
).then(
val=>{
console.log(getTitle(val));
return getHtml('https://www.sina.com'); // 返回Promise对象
}
).then(
val=>{
console.log(getTitle(val));
}
).catch(
err=>{
console.log(err);
}
);
Safari运行效果 ( 停用跨域限制 )

浙公网安备 33010602011771号