JavaScript 是一门单线程语言,但是在实际开发中,我们需要进行异步编程来处理用户交互、网络请求、文件读写等操作,以提高用户体验和程序性能。而在 ES6 中,新增了一些语法和 API,可以更方便地处理异步编程的问题。
1. Promise
Promise 是 ES6 中新增的一个类,用于处理异步操作的状态和结果。一个 Promise 对象可以处于三种状态:pending(等待状态)、fulfilled(成功状态)和 rejected(失败状态)。当 Promise 对象状态发生改变时,会触发相应的回调函数。
1.1 Promise 的基本用法
// javascriptcn.com 代码示例 const promise = new Promise((resolve, reject) => { setTimeout(() => { resolve('success'); }, 1000); }); promise.then((value) => { console.log(value); // 输出 'success' });
上面的代码中,我们创建了一个 Promise 对象,代表一个异步操作,在 1 秒后返回成功状态,并传递一个值 'success'。然后我们通过 then
方法注册了一个回调函数,在 Promise 对象状态发生改变时被调用,并接收 Promise 对象传递的值。
1.2 Promise 的链式调用
Promise 对象的 then
方法返回一个新的 Promise 对象,可以进行链式调用。
// javascriptcn.com 代码示例 const promise = new Promise((resolve, reject) => { resolve('success'); }); promise.then((value) => { console.log(value); // 输出 'success' return 'next'; }).then((value) => { console.log(value); // 输出 'next' });
上面的代码中,我们先创建了一个 Promise 对象返回成功状态,并传递一个值 'success'。然后我们通过 then
方法注册了一个回调函数,在 Promise 对象状态发生改变时被调用,并输出传递的值。在第一个 then
方法中,我们返回了一个新的值 'next',然后又调用了 then
方法注册了一个新的回调函数,并输出新的值。
1.3 Promise 的错误处理
Promise 对象的 catch
方法用于处理 Promise 对象的 rejected 状态。
const promise = new Promise((resolve, reject) => { reject(new Error('fail')); }); promise.catch((error) => { console.log(error); // 输出 Error 对象 });
上面的代码中,我们创建了一个 Promise 对象,代表一个异步操作,在执行过程中返回失败状态,并传递一个 Error 对象。然后我们通过 catch
方法注册了一个回调函数,在 Promise 对象状态发生改变时被调用,并输出传递的 Error 对象。
2. async/await
async/await 是 ES6 中新增的语法,用于简化 Promise 的使用。async/await 实际上是基于 Promise 实现的,它可以让我们在代码中使用类似同步的方式处理异步操作。
2.1 async/await 的基本用法
// javascriptcn.com 代码示例 function wait(time) { return new Promise((resolve, reject) => { setTimeout(() => { resolve(time); }, time); }); } async function test() { const result1 = await wait(1000); console.log(result1); // 输出 1000 const result2 = await wait(2000); console.log(result2); // 输出 2000 return result1 + result2; } test().then((value) => { console.log(value); // 输出 3000 });
上面的代码中,我们定义了一个 wait
函数,返回一个 Promise 对象,在指定时间后返回成功状态,并传递一个值。然后我们定义了一个 test
函数,使用 async/await 语法处理异步操作。在 test
函数中,我们先调用 wait
函数,并使用 await 关键字等待 Promise 对象的返回结果,然后输出结果。在第二次调用 wait
函数时,我们依然使用 await 关键字等待 Promise 对象的返回结果,并输出结果。最后,我们将两次调用的结果相加,并使用 Promise 对象返回结果。
2.2 async/await 的错误处理
async/await 语法可以使用 try/catch 来处理 Promise 对象的 rejected 状态。
// javascriptcn.com 代码示例 function wait(time) { return new Promise((resolve, reject) => { setTimeout(() => { reject(new Error('fail')); }, time); }); } async function test() { try { const result1 = await wait(1000); console.log(result1); } catch (error) { console.log(error); } } test(); // 输出 Error 对象
上面的代码中,我们定义了一个 wait
函数,返回一个 Promise 对象,在指定时间后返回失败状态,并传递一个 Error 对象。然后我们定义了一个 test
函数,使用 async/await 语法处理异步操作。在 test
函数中,我们先调用 wait
函数,并使用 await 关键字等待 Promise 对象的返回结果。在 try 块中,如果 Promise 对象返回成功状态,则输出结果;如果 Promise 对象返回失败状态,则进入 catch 块,输出传递的 Error 对象。
3. 总结
Promise 和 async/await 都是 ES6 中新增的用于处理异步编程的语法和 API。Promise 对象是基于回调函数实现的,可以通过链式调用和错误处理来简化异步编程。async/await 语法是基于 Promise 对象实现的,可以让我们在代码中使用类似同步的方式处理异步操作。在实际开发中,我们可以根据具体情况选择使用 Promise 或 async/await 来处理异步编程的问题。
以上是本文的全部内容,希望对大家学习和实践 JavaScript 异步编程有所帮助。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65644c1ed2f5e1655ddb8cfc