js异步代码同步写法

目录

1. 回调函数

2. Promise

3. Generator

4. async


1. 回调函数

它是ES5提供的异步编程解决方案

不过这种方法有诸多不便之处,它虽然由我们定义但是执行却依赖于第三方,且逻辑复杂就需要多层回调,不方便使用

//异步
setTimeout(() => {
    console.log('setTimeout')
}, 0)

2. Promise

它是ES6提供的一种异步编程解决方案,Promise是一个容器,保存着将来才会执行的代码;

从语法角度来说Promise是一个对象,可以用来获取异步操作的消息。异步操作,同步解决,避免了层层嵌套的回调函数。

  • 实例化

Promise构造函数接收一个函数作为参数,也就是回调函数;

该函数的两个参数分别是resolve和reject。

resolve作为成功的回调函数,reject作为失败的回调函数。

Promise对象代表一个异步操作有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。最后返回resolved(已定型)结果。

  • 实例方法

    定义在Promise.prototype中的方法,通过Promise实例可以直接调用


    then() 状态由pending变为fulfilled的时候也就是异步操作成功之后执行该回调函数
        参数:回调函数,回调函数的参数为resolve函数传递过来的值
        返回值:返回一个新的Promise实例对象,因此可以使用链式调用


    catch() 由pending变为rejected的时候执行该回调函数也就是异步失败之后执行该回调函数
        参数:回调函数,回调函数的参数为reject函数传递过来的值
        返回值:返回一个新的Promise实例对象,因此可以使用链式调用


    finally()无论异步操作执行成功失败与否,都会执行该回调
        参数:回调函数
        返回值:返回一个新的Promise实例对象

const promise = new Promise(function (resolve, reject) {
    if (1 > 0) {
        const response = {
            status: 200,
            message: '操作成功',
            data: null,
            timestamp: new Date().getTime()
        }
        resolve(response)// promise内部状态由padding => fulfilled
    } else {
        const response = {
            status: 500,
            message: '后台接口异常',
            data: null,
            timestamp: new Date().getTime()
        }
        reject(response)// promise内部状态由padding => rejected
    }
})
// promise成功之后,调用resolve(),对应就是.then内部的回调
// promise成功之后,调用reject(),对应就是.catch内部的回调
// promise实例直接调用.then.catch 这种用法是链式调用
promise.then((res) => {
    console.log(res);
}).catch((err) => {
    console.log(err);
})

3. Generator

它是ES6提供的一种异步编程解决方案,语法不同于普通函数;简单的把Generator 理解为一个状态机,封装了多个内部状态。执行Generator 函数会返回一个迭代器对象,可以通过调用迭代器next依次遍历Generator函数内部的每一个状态。

  • 创建Generator函数  每个状态之间都是独立的的
//声明一个generator函数
function* myGenFun() {
    console.log('状态一');
    // 每一个yield之间状态是独立的
    let result = yield 'hello'

    console.log('状态二');
    console.log(result);
    yield 'world'

    console.log('状态三');
    return 'ending'
    //因为return会阻止后面的代码运行,所以 Generator提供了yield
    //yiled也是返回值,但是执行一次状态停在了第一个yield ,依次执行next方法,执行下一个yield状态。代码分段执行,见到yield分一段
    //上一个yield之后是下个状态的开始, 下一个状态的结束在下一个yield。yield后面的是返回值。最后一个yield可以return返回
}
// generator函数的执行结果,是一个迭代器对象
let result = myGenFun()
console.log(result);
console.log(result.next());
console.log(result.next('你好'));
console.log(result.next());
  • 模拟发起异步请求 拿到第一个状态的返回结果在执行第二个状态,状态之间数据传递通过next
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <script src="./jquery.js"></script>
  <script>
    const baseURL = 'http://47.101.202.33:8888'

    function getAjax() {
      return $.ajax({
        url: baseURL + '/index/category/findAll',
        method: 'get',
        success(res) {
          iterator.next(res)
        }
      })
    }

    // 第一个状态的出口数据,作为下一个状态的入口数据
    // 这个数据是第二次调用.next()传递的实参
    function* myGenFun() {
      let result = yield getAjax()
      console.log('处理数据', result);
      yield '结束'
    }
    let iterator = myGenFun()
    iterator.next()
  </script>
</head>

<body>

</body>

</html>

4. async

它是一个函数,是一个ES7的异步编程解决方案,内部封装了generator函数,是一个语法糖,内部自带执行器,与await配合使用;异步编程,同步处理。

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="./jquery.js"></script>
    <script>
        const baseURL = 'http://47.101.202.33:8888'
        async function findAllCategory() {
            let res = await $.ajax({
                url: baseURL + '/index/category/findAll',
                method: 'get'
            })
            console.log(res);

            // let res = await axios.get({
            //   url: baseURL + '/index/category/findAll',
            //   method: 'get'
            // })
            // return res
        }
        findAllCategory().then((res) => { })
    </script>
</head>

<body>

</body>

</html>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Node.js是基于JavaScript运行的服务器端开发平台。它采用了异步非阻塞的事件驱动模型,因此能够高效地处理大量并发请求。 在Node.js中,异步处理是通过事件循环机制来实现的。当主线程中遇到异步操作(比如文件读写、网络请求等)时,它会将这些操作交给操作系统处理,并将相应的回调函数封装成事件对象放入事件队列中。主线程会继续执行后面的代码,直到同步代码执行完毕。 一旦主线程中的所有同步代码执行完毕,Node.js会循环检测事件队列,当某个事件被触发(比如异步操作完成),Node.js会调用相应的回调函数来处理这个事件。这种机制使得Node.js能够同时处理多个请求,而不会阻塞主线程。 Node.js提供了多种方式来处理异步操作,包括回调函数、Promise、async/await等。这些方式可以根据开发者的需求和个人习惯来选择和使用。 这些异步处理的写法可以帮助开发者更好地处理异步操作,确保代码的高效性和可维护性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [NodeJS -- 异步编程](https://blog.csdn.net/weixin_45933959/article/details/104804110)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [nodejs异步处理](https://blog.csdn.net/weixiao0111/article/details/107390650)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [详解Node.js异步处理的各种写法](https://download.csdn.net/download/weixin_38571759/12940939)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值