我们一起深入理解一下Javascript中的async/await与promise

2023-09-06 0 448

我们一起深入理解一下Javascript中的async/await与promise

async/await 和 Promise 都是 JavaScript 中的触发器程式设计辅助工具。它的主要就差别是句法和时效性。

Promise是一类第一类,用作则表示两个触发器操作方式的最后顺利完成(获得成功或失利),并提供更多了几组拉艾方式(then、catch、finally)来处置那个触发器操作方式的结论。

比如:

fetch(https://some-api.com/data) .then(response =>response.json()) .then(data => { console.log(data); }) .catch(error => { console.log(error); });

async/await 是句法糖,它能让他们采用并行的句法来撰写触发器标识符。它倚赖 Promise ,因而在采用 async/await 时,须要先将触发器操作方式PCB成 Promise。

比如:

async function getData() { const response = await fetch(https://some-api.com/data); const data = awaitresponse.json();console.log(data); }

Promise

Promise 是一类第一类,用作则表示两个触发器操作方式的最后顺利完成(获得成功或失利),并提供更多了几组拉艾方式(then、catch、finally)来处置那个触发器操作方式的结论。

比如:

fetch(https://some-api.com/data) .then(response => response.json()) .then(data => { console.log(data); }) .catch(error => { console.log(error); });

Promise通常包含以下方式:

Promise.all(iterable)方式用作将多个Promise实例包装成两个新的Promise实例。当所有的Promise都获得成功时,新的Promise实例才会获得成功,否则它就会失利。 比如:constpromise1 =Promise.resolve(3); const promise2 = 42; const promise3 = new Promise((resolve, reject) =>{ setTimeout(resolve,100, foo); }); Promise.all([promise1, promise2, promise3]).then((values) => { console.log(values); });// expected output: Array [3, 42, “foo”] Promise.any(iterable) 方式用作将多个Promise实例包装成两个新的Promise实例。只要有两个Promise获得成功,新的Promise实例就会获得成功,否则它就会失利。 比如:const promise1 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, first); }); const promise2 = new Promise((resolve, reject) =>{ setTimeout(resolve,2000, second); }); const promise3 = new Promise((resolve, reject) =>{ setTimeout(resolve,3000, third); }); Promise.any([promise1, promise2, promise3]).then((value) => { console.log(value); });// expected output: “first” Promise.race(iterable) 方式用作将多个Promise实例包装成两个新的Promise实例。当其中任意两个Promise获得成功或失利时,新的Promise实例就会获得成功或失利。 比如:const promise1 = new Promise((resolve, reject) =>{ setTimeout(resolve,3000, first); }); const promise2 = new Promise((resolve, reject) =>{ setTimeout(reject,2000, second); }); const promise3 = new Promise((resolve, reject) => { setTimeout(resolve, 1000, third); }); Promise.race([promise1, promise2, promise3]).then((value) => { console.log(value); },(reason) => { console.log(reason); });Promise.allSettled(iterable) 方式用作将多个Promise实例包装成两个新的Promise实例。该Promise在所有给定的Promise都顺利完成后才会顺利完成。这可能是获得成功或失利。 比如:const promise1 = new Promise((resolve, reject) =>{ setTimeout(resolve,1000, first); }); const promise2 = new Promise((resolve, reject) =>{ setTimeout(reject,2000, second); }); const promise3 = new Promise((resolve, reject) =>{ setTimeout(resolve,3000, third); }); Promise.allSettled([promise1, promise2, promise3]).then(values => { console.log(values); });// expected output: [{ status: “fulfilled”, value: “first” }, { status: “rejected”, reason: “second” }, { status: “fulfilled”, value: “third” }]

async/await

async/await 是句法糖,它能让他们采用并行的句法来撰写触发器标识符。它倚赖 Promise ,因而在采用 async/await 时,须要先将触发器操作方式PCB成 Promise。

比如:

async function getData() { constresponse =await fetch(https://some-api.com/data); const data = await response.json(); console.log(data); }

async/await 是ES7 引入的对 JavaScript 触发器程式设计的一类改进,它提供更多了采用并行样式标识符触发器访问资源的选项,而不会阻塞主线程。

采用 async/await 的优点

最重要的优点之一是它具有并行程式设计风格。让他们来看两个例子:

// async/await const getArticlesByAuthorWithAwait = async (authorId) => { constarticles =await articleModel.fetchAll(); return articles.filter((b) => b.authorId === authorId); }; // promise const getArticlesByAuthorWithPromise = (authorId) => { return articleModel .fetchAll() .then((articles) => articles.filter((b) => b.authorId === authorId)); };

能看到,采用 async/await 版本比采用 promise 版本更容易认知。如果忽略 await 关键字,标识符看起来就像其他并行语言,如 Python。 另外, async/await 在主流浏览器中有原生支持。

须要注意的是,在采用 async/await 时,须要成对出现。比如,在函数中采用 await,则必须将函数定义为 async。

采用 async/await 可能会产生一些误导和陷阱

async/await虽好,但是采用不当可能会产生一些问题。

await 并不会等待上两个触发器操作方式顺利完成。它只是让 JavaScript 引擎知道在那个点上应该等待,并且在触发器操作方式顺利完成后继续执行标识符。 比如:const getData = async () => { console.log(Start getting data); const data1 = await fetchData1(); console.log(Data 1 received); const data2 = await fetchData2(); console.log(Data 2 received); return { data1, data2 }; }; getData(); console.log(End of script);

这段标识符会先输出”Start getting data”,然后”End of script”,最后再输出”Data 1 received”和”Data 2 received”

await 不能在普通函数中采用。它只能在 async 函数中采用。 比如:const getData = () => { const data = await fetchData(); //TypeError:await is only valid in async function returndata; };await 只能用作 Promise 第一类。如果传入的不是两个Promise第一类,会立即resolve。 比如:const data = await 42; console.log(data); // 42await 后面的标识符会被PCB在 try/catch 中,如果出错,会产生reject状态。 比如:const getData = async () => { try { const data = await fetchData(); return data; } catch (error) { console.error(error); } };

async/await 是一类具有时效性和错误处置能力的新型触发器程式设计方式,能让他们更容易认知和维护触发器标识符。在采用 async/await 时,须要注意它依然是触发器标识符,不能直接和并行标识符一同工作。须要采用 promise 第一类或回调函数来将触发器标识符的结论传递给并行标识符。在采用 async/await 时还要注意采用 try/catch 来处置可能出现的错误。

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务