node.js await介绍

await 是 JavaScript 中的一个关键字,用于处理异步操作。它只能在 async 函数中使用,并用于暂停代码的执行,直到一个 Promise 完成(无论是成功 resolve 还是失败 reject)。await 可以使异步代码看起来像同步代码,从而提高可读性和可维护性。

1. 基本用法

await 用于等待一个 Promise 的完成,并返回 Promise 的结果。以下是一个简单的例子:

示例:使用 awaitasync
// 一个异步函数,返回一个 Promise
function fetchData() {
    return new Promise((resolve) => {
        setTimeout(() => {
            resolve('Data fetched');
        }, 2000); // 模拟一个耗时 2 秒的异步操作
    });
}

// 使用 async 声明一个异步函数
async function getData() {
    console.log('Fetching data...');
    
    // 使用 await 等待 fetchData 完成
    const data = await fetchData();
    
    console.log(data); // 输出: 'Data fetched'
}

getData();

2. await 的作用

  • 暂停执行await 会暂停所在的 async 函数中的代码执行,直到等待的 Promise 完成。上面的例子中,getData 在执行到 await fetchData() 时,会等待 fetchData 返回的 Promise 完成,然后将结果赋值给 data,再继续执行后续的代码。
  • 简化异步操作await 使得异步代码写起来像同步代码,从而避免了传统的“回调地狱”或者过度使用 .then() 的链式调用。

3. 错误处理

await 也可以与 try...catch 一起使用来捕获异步操作中的错误:

示例:错误处理
// 一个异步函数,返回一个 Promise
function fetchDataWithError() {
    return new Promise((_, reject) => {
        setTimeout(() => {
            reject('An error occurred while fetching data');
        }, 2000);
    });
}

async function getDataWithErrorHandling() {
    try {
        console.log('Fetching data...');
        
        // 使用 await 等待 fetchDataWithError 完成
        const data = await fetchDataWithError();
        
        console.log(data);
    } catch (error) {
        console.error('Error:', error); // 输出: 'Error: An error occurred while fetching data'
    }
}

getDataWithErrorHandling();

在这个例子中,await fetchDataWithError() 会抛出错误,该错误被 try...catch 捕获并处理。

4. 注意事项

asyncawait 让异步编程更加简洁、直观,是现代 JavaScript 中处理异步操作的重要工具。

  1. 必须在 async 函数中使用await 只能在声明为 async 的函数中使用。尝试在非 async 函数中使用 await 会导致语法错误。

  2. // 错误示例:await 只能在 async 函数中使用
    function incorrectUsage() {
        const result = await fetchData(); // SyntaxError: Unexpected identifier
    }
    

    await 会阻塞当前 async 函数的执行await 会暂停当前 async 函数的执行,直到 Promise 完成。其他不受影响的代码仍会继续执行。例如:

  3. async function process() {
        console.log('Start');
        
        await new Promise(resolve => setTimeout(resolve, 2000)); // 等待 2 秒
        
        console.log('End');
    }
    
    process();
    console.log('This will log before "End"');
    

  4. 在这个例子中,"This will log before 'End'" 会在 "End" 打印之前被输出,因为 await 只暂停 process 函数,而不会阻塞整个程序的执行。

  5. 5. 并行执行

    当需要并行执行多个异步操作时,可以使用 Promise.all() 来同时等待多个 Promise,而不是逐个 await。例如:

  6. async function fetchData1() {
        return new Promise(resolve => setTimeout(() => resolve('Data 1 fetched'), 2000));
    }
    
    async function fetchData2() {
        return new Promise(resolve => setTimeout(() => resolve('Data 2 fetched'), 1000));
    }
    
    async function fetchAllData() {
        // 使用 Promise.all 并行执行多个异步操作
        const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
        
        console.log(data1); // 输出: 'Data 1 fetched'
        console.log(data2); // 输出: 'Data 2 fetched'
    }
    
    fetchAllData();
    

    在这个例子中,fetchData1()fetchData2() 是并行执行的,总耗时为两者中最长的那一个(2 秒),而不是它们的总和(3 秒)。

    6. 返回值

    await 表达式的返回值是被等待的 Promise 完成后的结果。它也可以用于非 Promise 的值,如果传递给 await 的不是一个 Promise,它会直接返回这个

  7. async function getValue() {
        const value = await 42;
        console.log(value); // 输出: 42
    }
    
    getValue();
    

    总结

  8. await 用于暂停 async 函数中的代码执行,等待 Promise 完成,并返回其结果。
  9. 它只能在 async 函数中使用,不能在全局或普通函数中使用。
  10. 结合 try...catch 来处理错误,更加直观且简洁。
  11. 可以利用 Promise.all() 进行并行的异步操作,提高执行效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值