node_sync函数_axios原理封装

复制代码
// 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)) })()
复制代码

 

posted @   前端之旅  阅读(465)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示