• JavaScript 回调函数/Promise/ async/await


    并发和并行

    并行和并发是两个概念,容易混淆是因为并行和并发在中文意思上相近,其实在英文中,这是完全不相同的东西,并行(parallelism)、并发(concurrency)。

    并行(parallelism):是微观概念,假设CPU有两个核心,则我们就可以同时完成任务A和任务B,同时完成多个任务的情况就可以称之为并行。
    并发(concurrency):是宏观概念,现在有任务A和任务B,在一段时间内,通过任务之间的切换完成这两个任务,这种情况称之为并发。

    回调函数

    回调函数广泛存在于我们所编写的JavaScript代码中,它表现在事件绑定,Ajax请求或者其他的情况下,一个回调函数可表现成如下形式

    1. ajax(url, () => {
    2. console.log('这里是回调函数');
    3. })

    回调地狱: 回调函数很好的解决了某些异步情况,但过度滥用回调函数会造成回调地狱,即回调函数过长,嵌套过深。过长或者嵌套过深的回调函数,会让回调函数存在强耦合关系,一旦有一个函数有所改动,那么可能会牵一发而动全身。一个回调地狱可能如下所示:

    1. ajax(firstUrl, () => {
    2. console.log('这里是首次回调函数');
    3. ajax(secondUrl, () => {
    4. console.log('这里是第二次回调函数');
    5. ajax(threeUrl, () => {
    6. console.log('这里是第三次回调函数');
    7. // todo更多
    8. })
    9. })
    10. })

    Generator

    在ES6之前,一个函数一旦执行将不会被中断,一直到函数执行完毕,在ES6之后,由于Generator的存在,函数可以暂停自身,待到合适的机会再次执行。用Generator可以解决回调地狱。

    1. function *fetch() {
    2. yield ajax(url, () => {console.log('这里是首次回调函数');});
    3. yield ajax(url, () => {console.log('这里是第二次回调函数');});
    4. yield ajax(url, () => {console.log('这里是第三次回调函数');});
    5. }
    6. var it = fetch();
    7. var result1 = it.next();
    8. var result2 = it.next();
    9. var result3 = it.next();

    Promise

    Promise翻译过来就是承诺的意思,Promise一共有三种状态:pending(等待中)resolve(完成)reject(拒绝),这个承诺意味着在将来一定会有一个表决,并且只能表决一次,表决的状态一定是resolve(完成)或者reject(拒绝),一个Promise可能会是如下的形式:

    1. // 普通的Promise
    2. function foo() {
    3. return new Promise((resolve,reject) => {
    4. // 第一次表决有效,其后无论是resolve()还是reject()都无效
    5. resolve(true);
    6. resolve(false);
    7. })
    8. }
    9. // Promise解决回调地狱
    10. ajax(url).then(res => {
    11. console.log('这里是首次回调函数');
    12. }).then(res => {
    13. console.log('这里是第二次回调函数');
    14. }).then(res => {
    15. console.log('这里是第三次回调函数');
    16. })

    async/await

    如果一个方法前面加上了async,那么这个方法就会返回一个Promiseasync就是将函数用Promise.resolve()包裹了下,并且await只能配合async使用,不能单独出现。一个async/await可能会是如下的形式:

    1. // 普通的async/await
    2. async function foo() {
    3. let number = await 3; // await自动用promise.resolve()包装
    4. console.log(number);
    5. }
    6. foo();
    7. // async/await解决回调地狱
    8. async function fetch() {
    9. var result1 = await ajax(url1);
    10. var result2 = await ajax(url2);
    11. var result3 = await ajax(url3);
    12. }
    13. fetch();

    如若转载,请注明出处:开源字节   https://sourcebyte.cn/article/170.html

  • 相关阅读:
    AI入门之深度学习:基本概念篇
    【Java面试】十二、Kafka相关
    CF825G题解
    深度学习神经网络协同过滤模型(NCF)与用户协同过滤(UCF)的区别
    DIN模型和SIM模型原理与实践
    jar打war包
    学习 vite + vue3 + pinia + ts(-)项目创建vs一些改变
    《UNIX网络编程》第一步:编写自己的daytime客户端,并从daytime服务器获取时间
    关联规则挖掘(下):数据分析 | 数据挖掘 | 十大算法之一
    【Git】轻松学会 Git(一):掌握 Git 的基本操作
  • 原文地址:https://blog.csdn.net/qq_35634154/article/details/125480436