// async 函数
//
// 1.内置执行器。
// Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。
// 也就是说,async函数的执行,与普通函数一模一样,只要一行
//
// 2.更好的语义。
// async和await,比起星号和yield,语义更清楚了。
// async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
//
// 3.更广的适用性
// async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,
// 但这时会自动转成立即 resolved 的 Promise 对象)。
//
// 4.async函数的返回值是 Promise 对象,你可以用then方法指定下一步的操作。
// async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。
// async函数返回一个 Promise 对象。
// async函数内部return语句返回的值,会成为then方法回调函数的参数。
// async function f() {
// return 'hello world';
// }
// f().then(v => console.log(v)) // ===> "hello world"
// // 上面代码中,函数f内部return命令返回的值,会被then方法回调函数接收到。
// // async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。
// // 抛出的错误对象会被catch方法回调函数接收到。
// async function f1() {
// throw new Error('出错了');
// }
// f().then(
// v => console.log(v),
// e => console.log(e)
// )// ==> Error: 出错了
// await命令
// 正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。
// 如果不是 Promise 对象,就直接返回对应的值。
// async function fn() {
// // 等同于
// // return 123;
// return await 123;
// }
// fn().then(v => console.log(v)) // ==>123
// // 任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
// async function fn1() {
// await Promise.reject('出错了');
// await Promise.resolve('hello world'); // 不会执行
// }
// // 有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。
// // 这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。
// async function fn2() {
// try {
// await Promise.reject('出错了');
// } catch(e) { }
// return await Promise.resolve('hello world');
// }
// fn2().then(v => console.log(v))// ==> hello world
// // 另一种方法是await后面的 Promise 对象再跟一个catch方法,处理前面可能出现的错误。
// async function f() {
// await Promise.reject('出错了')
// .catch(e => console.log(e));
// return await Promise.resolve('hello world');
// }
// f().then(v => console.log(v)) // 出错了 // hello world
function myaxios (url) {
return new Promise((resolve, reject)=> {
try{
let xhr = new XMLHttpRequest()
xhr.open('get', url)
let handle = () => {
if (xhr.readyState !== 4) return
if (xhr.status>=200 && xhr.status<300 || xhr.status == 304) {
resolve(xhr.responseText)
}
}
xhr.onreadystatechange = handle
xhr.send()
}catch(e) {
reject(e)
}
})
}
//返回promise对象,
let request = myaxios('http://localhost:8888/index.html?getdata=newsdata')
request
.then(data => console.log('request',JSON.parse(data)))
.catch(err=> console.log(err))
//用async函数调用
;(async ()=>{
// await命令后面是一个 Promise 对象,返回该对象的结果
// 如果不是 Promise 对象,就直接返回对应的值。
let result = await myaxios('http://localhost:8888/index.html?getdata=newsdata')
console.log(JSON.parse(result))
})()