我的编程空间,编程开发者的网络收藏夹
学习永远不晚

promise.all怎么实现

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

promise.all怎么实现

本篇内容主要讲解“promise.all怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“promise.all怎么实现”吧!

何为Promise.all?

Promise.all 是 es6 Promise 对象上的一个方法,它的功能就是将多个Promise实例包装成一个promise实例。以下是 MDN 对 Promise.all 的描述:

Promise.all() 方法接收一个 promise 的 iterable 类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise实例, 那个输入的所有 promise 的 resolve 回调的结果是一个数组。这个Promise的 resolve 回调执行是在所有输入的 promise 的 resolve 回调都结束,或者输入的 iterable 里没有 promise 了的时候。它的 reject 回调执行是,只要任何一个输入的 promise 的 reject 回调执行或者输入不合法的 promise 就会立即抛出错误,并且reject的是第一个抛出的错误信息。

我戴上我的300度近视眼镜,仔细地提取出这段描述中的关键字

  • Promise.all 的返回值是一个新的 Promise 实例。

  • Promise.all 接受一个可遍历的数据容器,容器中每个元素都应是 Promise 实例。咱就是说,假设这个容器就是数组。

  • 数组中每个 Promise 实例都成功时(由pendding状态转化为fulfilled状态),Promise.all 才成功。这些 Promise 实例所有的 resolve 结果会按照原来的顺序集合在一个数组中作为 Promise.allresolve 的结果。

  • 数组中只要有一个 Promise 实例失败(由pendding状态转化为rejected状态),Promise.all 就失败。Promise.all.catch() 会捕获到这个 reject

原生 Promise.all 测试

咱先看看原生的Promise.all的是啥效果。

const p1 = Promise.resolve('p1')const p2 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p2 延时一秒')  }, 1000)})const p3 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p3 延时两秒')  }, 2000)})const p4 = Promise.reject('p4 rejected')const p5 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('p5 rejected 延时1.5秒')  }, 1500)})// 所有Promise实例都成功Promise.all([p1, p2, p3])  .then(res => {    console.log(res)  })  .catch(err => console.log(err)) // 2秒后打印 [ 'p1', 'p2 延时一秒', 'p3 延时两秒' ]  // 一个Promise实例失败Promise.all([p1, p2, p4])  .then(res => {    console.log(res)  })  .catch(err => console.log(err)) // p4 rejected  // 一个延时失败的Promise Promise.all([p1, p2, p5])  .then(res => {    console.log(res)  })  .catch(err => console.log(err)) // 1.5秒后打印 p5 rejected  // 两个Promise实例失败Promise.all([p1, p4, p5])  .then(res => {    console.log(res)  })  .catch(err => console.log(err)) // p4 rejected

注意

上面 p4p5 在未传入 Promise.all 时需要注释掉,因为一个调用了 rejectPromise 实例如果没有使用 .catch() 方法去捕获错误会报错。但如果 Promise 实例定义了自己的 .catch,就不会触发 Promise.all.catch() 方法。

OK,理论存在,实践开始!

手动实现Promise.all

  • Promise.all 接受一个数组,返回值是一个新的 Promise 实例

Promise.MyAll = function (promises) {  return new Promise((resolve, reject) => {  })}
  • 数组中所有 Promise 实例都成功,Promise.all 才成功。不难想到,咱得需要一个数组来收集这些 Promise 实例的 resolve 结果。但有句俗话说得好:“不怕一万,就怕万一”,万一数组里面有元素不是 Promise咋办 —— 那就得用 Promise.resolve() 把它办了。这里还有一个问题,Promise 实例是不能直接调用 resolve 方法的,咱得在 .then() 中去收集结果。注意要保持结果的顺序。

Promise.MyAll = function (promises) {  let arr = []  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        arr[i] = res      })    })   })}
  • 将收集到的结果(数组arr)作为参数传给外层的 resolve 方法。这里咱们肯定是有一个判断条件的,如何判断所有 Promise 实例都成功了呢?新手容易写出这句代码(没错就是我本人了????):

if (arr.length === promises.length) resolve(arr)

咱仔细想想 Promise 使用来干嘛的 —— 处理异步任务。对呀,异步任务很多都需要花时间呀,如果这些 Promise 中最后一个先完成呢?那 arr 数组不就只有最后一项了,前面的所有项都是 empty。所以这里咱们应该创建一个计数器,每有一个 Promise 实例成功,计数器加一:

Promise.MyAll = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        arr[i] = res        count += 1        if (count === promises.length) resolve(arr)      })    })  })}
  • 最后就是处理失败的情况了,这里有两种写法,第一种是用 .catch() 方法捕获失败:

Promise.MyAll = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        arr[i] = res        count += 1        if (count === promises.length) resolve(arr)      }).catch(reject)    })  })}

第二种写法就是给 .then() 方法传入第二个参数,这个函数是处理错误的回调函数:

Promise.MyAll = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        arr[i] = res        count += 1        if (count === promises.length) resolve(arr)      }, reject)    })  })}

测试案例

致此 Promise.all 大功告成,赶紧拿来测试一下(摩拳擦掌):

const p1 = Promise.resolve('p1')const p2 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p2 延时一秒')  }, 1000)})const p3 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p3 延时两秒')  }, 2000)})const p4 = Promise.reject('p4 rejected')const p5 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('p5 rejected 延时1.5秒')  }, 1500)})// 所有 Promsie 都成功Promise.MyAll([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // 2秒后打印 [ 'p1', 'p2 延时一秒', 'p3 延时两秒' ]  // 一个 Promise 失败Promise.MyAll([p1, p2, p4])  .then(res => console.log(res))  .catch(err => console.log(err)) // p4 rejected  // 一个延时失败的 PromisePromise.MyAll([p1, p2, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // 1.5秒后打印 p5 rejected 延时1.5秒 // 两个失败的 PromisePromise.MyAll([p1, p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // p4 rejected

“OhOhOhOh~~~~”,与原生的 Promise.all运行结果不能说很像,只能说一模一样。老话说的好,趁热打铁——正在火候上。我打开某个学习网站(MDN Web Docs (mozilla.org)),了解到 Promise 对象用于同时处理多个 Promise 的方法还有 Promise.racePromise.anyPromise.allSettle。从小老师就教会了咱们举一反三,仔细看了这三个方法的描述之后,我还真给反出来了????。

Promise.race

Promise.race 从字面意思理解就是赛跑,以状态变化最快的那个 Promise 实例为准,最快的 Promise 成功 Promise.race 就成功,最快的 Promise 失败 Promise.race 就失败。

咱来看看原生 Promise.race 效果

原生 Promise.race 测试

const p1 = Promise.resolve('p1')const p2 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p2 延时一秒')  }, 1000)})const p3 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p3 延时两秒')  }, 2000)})const p4 = Promise.reject('p4 rejected')const p5 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('p5 rejected 延时1秒')  }, 1500)})// p1无延时,p2延时1s,p3延时2sPromise.race([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1// p4无延时rejectPromise.race([p4, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p4 rejected  // p5 延时1.5秒reject,p2延时1sPromise.race([p5, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // 1s后打印: p2 延时一秒

理论存在,实践开始

手写Promise.race

整体流程与 Promise 差不多,只是对数组中的 Promise 实例处理的逻辑不一样,这里我们需要将最快改变状态的 Promise 结果作为 Promise.race 的结果,相对来说就比较简单了,代码如下:

Promise.MyRace = function (promises) {  return new Promise((resolve, reject) => {    // 这里不需要使用索引,只要能循环出每一项就行    for (const item of promises) {      Promise.resolve(item).then(resolve, reject)    }  })}

测试案例

还是刚才几个案例,咱就不重复写了????

// p1无延时,p2延时1s,p3延时2sPromise.MyRace([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1// p4无延时rejectPromise.MyRace([p4, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p4 rejected  // p5 延时1.5秒reject,p2延时1sPromise.MyRace([p5, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // 1s后打印: p2 延时一秒

可以看到,结果与原生的 Promise.race 是一致的,成功!

Promise.any

Promise.anyPromise.all 可以看做是相反的。Promise.any 中只要有一个 Promise 实例成功就成功,只有当所有的 Promise 实例失败时 Promise.any 才失败,此时Promise.any 会把所有的失败/错误集合在一起,返回一个失败的 promise AggregateError类型的实例。MDN 上说这个方法还处于试验阶段,如果 node 或者浏览器版本过低可能无法使用,各位看官自行测试下。

原生 Promise.any 测试

const p1 = Promise.resolve('p1')const p2 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p2 延时一秒')  }, 1000)})const p3 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p3 延时两秒')  }, 2000)})const p4 = Promise.reject('p4 rejected')const p5 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('p5 rejected 延时1.5秒')  }, 1500)})// 所有 Promise 都成功Promise.any([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1  // 两个 Promise 成功Promise.any([p1, p2, p4])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1// 只有一个延时成功的 PromisePromise.any([p2, p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // p2 延时1秒// 所有 Promise 都失败Promise.any([p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // AggregateError: All promises were rejected

可以看出,如果 Promise.any 中有多个成功的 Promise 实例,则以最快成功的那个结果作为自身 resolve 的结果。

OK,理论存在,实践开始

手写Promise.any

  • 依葫芦画瓢,咱们先写出 Promise.any 的整体结构:

Promise.MyAny = function (promises) {  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {    })  })}
  • 这里跟Promise.all 的逻辑是反的,咱们需要收集 rejectPromise,也需要一个数组和计数器,用计数器判断是否所有的 Promise 实例都失败。另外在收集失败的 Promise 结果时咱需要打上一个失败的标记方便分析结果。

Promise.MyAny = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(resolve, err => {        arr[i] = { status: 'rejected', val: err }        count += 1        if (count === promises.length) reject(new Error('没有promise成功'))      })    })  })}

这里我没有使用 MDN 上规定的 AggregateError 实例,手写嘛,随心所欲一点,写自己看着舒服的????

测试案例

// 所有 Promise 都成功Promise.MyAny([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1  // 两个 Promise 成功Promise.MyAny([p1, p2, p4])  .then(res => console.log(res))  .catch(err => console.log(err)) // p1// 只有一个延时成功的 PromisePromise.MyAny([p2, p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // p2 延时1秒// 所有 Promise 都失败Promise.MyAny([p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err)) // 没有promise成功

Promise.allSettled

有时候,咱代码人总是会有点特殊的需求:如果咱希望一组 Promise 实例无论成功与否,都等它们异步操作结束了在继续执行下一步操作,这可如何是好?于是就出现了 Promise.allSettled

原生 Promise.allSettled 测试

const p1 = Promise.resolve('p1')const p2 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p2 延时一秒')  }, 1000)})const p3 = new Promise((resolve, reject) => {  setTimeout(() => {    resolve('p3 延时两秒')  }, 2000)})const p4 = Promise.reject('p4 rejected')const p5 = new Promise((resolve, reject) => {  setTimeout(() => {    reject('p5 rejected 延时1.5秒')  }, 1500)})// 所有 Promise 实例都成功Promise.allSettled([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // [//   { status: 'fulfilled', value: 'p1' },//   { status: 'fulfilled', value: 'p2 延时一秒' },//   { status: 'fulfilled', value: 'p3 延时两秒' }// ]// 有一个 Promise 失败Promise.allSettled([p1, p2, p4])  .then(res => console.log(res))  .catch(err => console.log(err))// [//   { status: 'fulfilled', value: 'p1' },//   { status: 'fulfilled', value: 'p2 延时一秒' },//   { status: 'rejected' , value: 'p4 rejected' }// ]// 所有 Promise 都失败Promise.allSettled([p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err))// [//   { status: 'rejected', reason: 'p4 rejected' },//   { status: 'rejected', reason: 'p5 rejected 延时1.5秒' }// ]

可以看到,与 Promise.any 类似,Promise.allSettled 也给所有收集到的结果打上了标记。而且 Promise.allSettled 是不会变成 rejected 状态的,不管一组 Promise 实例的各自结果如何,Promise.allSettled 都会转变为 fulfilled 状态。

OK,理论存在,实践开始

手写 Promise.allSettled

咱就是说,得用个数组把所有的 Promise 实例的结果(无论成功与否)都收集起来,判断收集完了(所有 Promise 实例状态都改变了),咱就将这个收集到的结果 resolve 掉。收集成功 Promise 结果的逻辑咱们在 Promise.all 中实现过,收集失败 Promise 结果咱们在 Promise.any 中处理过。这波,这波是依葫芦画瓢——照样。

Promise.MyAllSettled = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        arr[i] = { status: 'fulfilled', val: res }        count += 1        if (count === promises.length) resolve(arr)      }, (err) => {        arr[i] = { status: 'rejected', val: err }        count += 1        if (count === promises.length) resolve(arr)      })    })  })}

这代码,逻辑上虽说没问题,但各位优秀的程序员们肯定是看不顺眼的,怎么会有两段重复的代码捏,不行,咱得封装一下。

Promise.MyAllSettled = function (promises) {  let arr = [],    count = 0  return new Promise((resolve, reject) => {    const processResult = (res, index, status) => {      arr[index] = { status: status, val: res }      count += 1      if (count === promises.length) resolve(arr)    }    promises.forEach((item, i) => {      Promise.resolve(item).then(res => {        processResult(res, i, 'fulfilled')      }, err => {        processResult(err, i, 'rejected')      })    })  })}

perfect,俗话说得好:没病走两步。老样子,给代码跑几个案例。

测试案例

// 所有 Promise 实例都成功Promise.MyAllSettled([p1, p2, p3])  .then(res => console.log(res))  .catch(err => console.log(err)) // [//   { status: 'fulfilled', value: 'p1' },//   { status: 'fulfilled', value: 'p2 延时一秒' },//   { status: 'fulfilled', value: 'p3 延时两秒' }// ]// 有一个 MyAllSettled 失败Promise.allSettled([p1, p2, p4])  .then(res => console.log(res))  .catch(err => console.log(err))// [//   { status: 'fulfilled', value: 'p1' },//   { status: 'fulfilled', value: 'p2 延时一秒' },//   { status: 'rejected' , value: 'p4 rejected' }// ]// 所有 MyAllSettled 都失败Promise.allSettled([p4, p5])  .then(res => console.log(res))  .catch(err => console.log(err))// [//   { status: 'rejected', reason: 'p4 rejected' },//   { status: 'rejected', reason: 'p5 rejected 延时1.5秒' }// ]

到此,相信大家对“promise.all怎么实现”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

promise.all怎么实现

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

promise.all怎么实现

本篇内容主要讲解“promise.all怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“promise.all怎么实现”吧!何为Promise.all?Promise.all 是 es6
2023-07-02

如何实现Promise.all

这篇文章主要介绍“如何实现Promise.all”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何实现Promise.all”文章能帮助大家解决问题。Promise.resolve简要回顾Promi
2023-07-02

async/await实现Promise.all()的方式

Promise.all()方法接收一个promise的iterable类型的输入,并且只返回一个Promise实例,并且输入的所有promise的resolve回调的结果是一个数组,对async/await实现Promise.all()相关知识感兴趣的朋友一起看看吧
2022-12-19

怎么使用ES6的Promise.all实现至少请求多长时间

本篇内容介绍了“怎么使用ES6的Promise.all实现至少请求多长时间”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、背景我们都知道a
2023-06-17

ES6中的Promise.all()和Promise.race()函数的实现方法

这篇文章主要介绍了ES6的Promise.all()和Promise.race()函数,结合实例代码介绍了ES6Promise.race和Promise.all方法使用,通过实例代码给大家介绍的非常详细,需要的朋友可以参考下
2023-02-03

Hash表怎么实现

本篇内容介绍了“Hash表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1、什么是Hash表Hash,一般翻译做“散列”,也有直接音
2023-06-02

golang怎么实现chcon

今天小编给大家分享一下golang怎么实现chcon的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。在golang中,使用ex
2023-07-06

Android Service怎么实现

今天小编给大家分享一下Android Service怎么实现的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一.APP侧启动S
2023-07-04

mysql锁怎么实现

mysql 的锁定机制采用乐观并发控制,使用表锁、行锁和间隙锁。锁通过读写锁实现,并在事务提交时验证。锁定升级允许在需要更大范围访问时升级锁。锁在事务提交或回滚时释放,或通过 unlock tables 语句手动释放。锁的使用应谨慎,因为它
mysql锁怎么实现
2024-05-30

Java怎么实现enum

在Java中,可以通过关键字`enum`来定义枚举类型。以下是实现enum的示例代码:```javapublic enum DayOfWeek {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, S
2023-08-21

Go怎么实现WebSockets

这篇文章主要介绍了Go怎么实现WebSockets的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Go怎么实现WebSockets文章都会有所收获,下面我们一起来看看吧。什么是 WebSockets简而言之,We
2023-06-30

Pytorch怎么实现Transformer

本篇内容主要讲解“Pytorch怎么实现Transformer”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Pytorch怎么实现Transformer”吧!一、构造数据1.1 句子长度# 关于
2023-06-30

php怎么实现telnet

php实现telnet的方法:1、创建一个PHP示例文件;2、通过“class PHPTelnet {function Connect($server,$user,$pass) {...}}”方式实现telnet功能即可。
2019-05-07

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录