这篇文章主要介绍了JavaScript中异步/等待怎么用,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。
ES8引入的<代码>异步/等待> 代码在JavaScript的异步编程中是一个极好的改进。它提供了使用同步样式代码异步访问<代码>优化> 代码的方式,而不会阻塞主线程。然而,它们也存在一些坑及问题。在本文中,将从不同的角度探讨<代码>异步/等待> 代码,并演示如何正确有效地使用这对兄弟。
前置知识
<强>异步作用是什么强>
从MDN可以看出:
<代码>异步代码>函数返回的是一个<强> 强>承诺对象。<强>异步强>函数(包含函数语句,函数表达式,λ表达式)会返回一个<强> 强>承诺对象,如果在函数中<代码> 代码>返回一个直接量,<强>异步强>会把这个直接量通过<代码> Promise.resolve() 代码>封装成<强> 强>承诺对象。
如果<强>异步强>函数没有返回值,它会返回<代码> Promise.resolve(定义)代码>。
<强>等待作用是什么强>
从MDN了解到:
<强>等待强>等待的是一个表达式,这个表达式的计算结果是<强> 强>承诺对象或者其它值(换句话说,<强>等待强>可以等任意表达式的结果)。
如果它等到的不是一个承诺对象,那等待表达式的运算结果就是它等到的东西。
如果它等到的是一个承诺对象,等待就忙起来了,它会阻塞后面的代码,等着承诺对象的决心,然后得到解决的值,作为等待表达式的运算结果。
这就是等待必须用在异步函数中的原因.async函数调用不会造成阻塞,它内部所有的阻塞都被封装在一个承诺对象中异步执行。引用>异步/等待的优点
<代码>异步/等待> 代码带给我们的最重要的好处是同步编程风格。让我们看一个例子:
//异步/等待 异步getBooksByAuthorWithAwait (authorId) { const书=等待bookModel.fetchAll (); 返回的书。过滤器(b=比;b。authorId===authorId); }//承诺 getBooksByAuthorWithPromise (authorId) { 返回bookModel.fetchAll () 不要犹豫(书=比;书。过滤器(b=比;b。authorId===authorId)); }很明显,<代码>异步/等待> 代码版本比<代码> 代码>版承诺本更容易理解。如果忽略<代码>等待代码> 关键字,代码看起来就像任何其他同步语言,比如Python <强> 强>。
最佳的地方不仅在于可读性。<代码>异步/等待> 代码到今天为止,所有主流浏览器都完全支持异步功能。
getBooksByAuthorWithPromise (authorId) { 如果(! authorId) { 返回null; } 返回bookModel.fetchAll () 不要犹豫(书=比;书。过滤器(b=比;b。authorId===authorId)); }
在上述代码中,<代码> getBooksByAuthorWithPromise> 代码可能返回<强> 强>承诺(正常情况下)或<强>空>强值(异常情况下),在异常情况下,调用者不能调用<代码>区间()> 代码。有了<代码>异步代码>声明,这种情况就不会出现了。
异步/等待可能会产生误导
一些文章将<强>异步/等待强>与<强> 强>承诺进行了比较,并声称它是JavaScript下一代异步编程风格,对此作者深表异议。<代码>异步/等待> 代码是一种改进,但它只不过是一种语法糖,不会完全改变我们的编程风格。
从本质上说,<强>异步强>函数仍然是<强> >强的承诺。在正确使用
JavaScript中异步/等待怎么用