谈谈前端开发中的同步和异步,promise、async/await,应用场景,以及在事件循环机制中的区别

同步

在计算机编程中,同步和异步是两种不同的执行模式。在同步模式下,程序按顺序执行,即一行代码执行完后才执行下一行代码,直到所有代码执行完毕。而在异步模式下,程序会在执行某些代码的同时执行其他代码。

举个例子,如果要读取文件,同步模式下程序会一直等待直到文件被读取完成,然后再继续执行下面的代码。而在异步模式下,程序会发起读取文件的请求并立即执行下面的代码,当文件读取完成后,再通过回调函数通知程序文件已经准备好了。

异步

异步模式的优点是可以提高程序的性能和响应速度,因为在等待某些操作完成的同时,程序可以执行其他操作。但是异步模式也会带来一些问题,例如代码的复杂性会增加,因为需要通过回调函数来处理异步操作的结果。此外,由于异步操作和同步操作并行执行,可能会导致数据不一致的问题。

对于异步操作,有一些常用的解决方案。其中最常用的是使用回调函数来处理异步操作的结果。另外,还可以使用Promise、async/await等语法糖来简化异步操作的处理。

  • Promise 是 ES6 中新增的一个异步处理机制,通过 Promise 可以更好地处理异步代码的复杂度,避免回调地狱(callback
    hell)。Promise 是一种承诺,表示一个异步操作的最终结果。一个 Promise 可以处于三种状态中的一种:

    • Pending(进行中):表示操作还在进行中,尚未完成;
    • Fulfilled(已完成):表示操作已经完成,并且成功地返回了结果;
    • Rejected(已拒绝):表示操作已经完成,但是出现了错误。

    当一个 Promise对象的状态发生改变时,它会自动触发对应的回调函数。我们可以通过 .then() 方法来指定 Promise 对象的成功时的回调函数,通过.catch() 方法来指定 Promise 对象的失败时的回调函数。

  • async/await 是 ES8 中引入的异步处理机制。async 函数是一种特殊的函数,它返回一个 Promise 对象,可以通过await 关键字来等待一个 Promise 对象的结果。
    async 函数的执行流程如下:

    • 当 async 函数被调用时,它会立即返回一个 Promise 对象,并且开始执行函数体中的代码;
    • 当遇到一个 await表达式时,async 函数会暂停执行,直到等待的 Promise 对象返回结果;
    • 如果 Promise 对象返回的是一个错误,async函数会抛出一个异常;
    • 如果 Promise 对象返回的是一个成功的结果,async 函数会将这个结果作为 await表达式的值,并且恢复执行。

    async/await 与 Promise相比,能够更直观地表达异步代码的执行顺序,也更易于调试和维护。但是,async/await 也有一些限制,例如无法直接取消一个正在执行的async 函数,因此在使用时需要注意。

总的来说,Promise 和 async/await 都是处理异步编程的强大工具,它们在不同的场景中都有着不同的应用。需要根据具体的业务需求和场景选择合适的方式来进行异步编程。

需要注意的是,在浏览器端,异步操作常常是通过事件驱动来实现的。例如,当用户点击某个按钮时,会触发一个事件,程序会通过事件监听器来处理这个事件。在事件监听器中,常常需要进行一些异步操作,例如向服务器发送请求等。此时需要注意事件处理函数中的异步操作可能会阻塞事件循环,因此应该尽可能避免阻塞操作。可以使用setTimeout、setInterval等API将异步操作放到事件循环的队列中,以避免阻塞。

promise的应用场景

  • 异步请求:在进行异步请求时,我们通常使用Promise来处理异步操作的结果,以便能够在异步操作完成后对其进行处理。例如,使用fetch方法获取商品列表数据时,可以将其封装为一个返回Promise对象的函数,然后在异步请求成功后,使用Promise.then()方法来获取数据。
  • 并发请求:在一些需要同时进行多个异步请求的场景下,使用Promise.all()方法可以将多个请求合并为一个Promise对象,并且能够在所有请求完成后一次性处理它们的结果。
  • 表单验证:在表单验证中,我们通常需要进行一些异步操作,例如检查用户名是否已被注册、验证手机验证码是否正确等。使用Promise可以很方便地处理这些异步操作,并且能够在异步操作完成后继续进行表单验证的下一步操作。
  • 错误处理:在开发中,我们通常需要对异常情况进行处理,例如网络请求超时、服务器返回错误等。使用Promise.catch()方法可以捕获这些异常,并对其进行处理。

promise 、async/await 在事件循环机制中的不同之处

Promise 是基于回调函数的一种异步编程解决方案,它本身不会影响事件循环机制。当 Promise 调用 then 方法注册回调函数时,会将回调函数注册到任务队列中,等待事件循环机制执行。

async/await 是基于 Promise 的异步编程解决方案,它通过 async 函数将函数的执行结果封装成 Promise 对象,从而让函数的返回值变为 Promise 对象,方便使用 Promise 对象的 then 方法注册回调函数。async 函数内部使用 await 关键字等待 Promise 对象返回结果,此时事件循环会暂停 async 函数的执行,直到 Promise 对象状态变为 resolved 或者 rejected,才会继续执行 async 函数后面的代码。

总的来说,Promise 和 async/await 都是基于事件循环机制的异步编程解决方案。Promise 的回调函数执行时机受 Promise 状态变化的影响,async/await 利用 Promise 对象的状态变化来实现暂停和恢复异步操作的执行。

举例说明:

function resolveAfter2Seconds() {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log("hhh");
            resolve('resolved');
        }, 2000);
    });
}

async function asyncCall() {
    console.log('calling');
    const result = await resolveAfter2Seconds();
    console.log(result);
    console.log('done');
}

asyncCall();

输出:
谈谈前端开发中的同步和异步,promise、async/await,应用场景,以及在事件循环机制中的区别_第1张图片

function resolveAfter2Seconds() {
    return new Promise(resolve => {
        setTimeout(() => {
            console.log("hhh");
            resolve('resolved');
        }, 2000);
    });
}

function promiseCall() {
    console.log('calling');
    const result = resolveAfter2Seconds();
    console.log(result);
    console.log('done');
}

promiseCall();

输出:
谈谈前端开发中的同步和异步,promise、async/await,应用场景,以及在事件循环机制中的区别_第2张图片

你可能感兴趣的:(前端,前端,javascript,java)