异步和等待的用途是什么?为什么在智能接触测试中有这么多异步和等待?
发布于 2022-09-17 18:00:17
不仅在智能契约测试上,而且在Javascript和Nodejs中,通常会发现许多异步/等待函数调用。
Javascript是单线程的。那么,如何通过一个线程获得这种异步感呢?轻松地,Javascript将异步工作委托给运行时,当它完成时,它将接收响应。
Javascript有一个单线程事件循环,用于检查调用堆栈和处理项。如果调用堆栈为空,它将检查回调队列,获取响应,并开始处理它,在代码执行时将更多的项放入堆栈中,并在循环中继续处理。
如果有任何函数执行会阻塞唯一的线程,则可以将该函数执行发送到运行时进行处理,就像浏览器中的WebAPI一样。Js是单线程的,但浏览器不是.因此浏览器可以在后台工作,并将结果放在回调队列中。当事件循环处理堆栈中的任何内容时,它会检查它是否在回调队列中有响应,如果有,它会处理它。这同样适用于Nodejs (有几个额外的步骤,但原则相同)。
你可以在这里玩:https://www.jsv9000.app/
因此,如果您不使用await
调用一个函数,即async
或返回一个承诺,那么它将被发送到运行时以处理异步,它不会等待响应,它将继续执行该行下面的代码。这意味着,如果您期望使用由async
或诺言函数返回的值,那么您将只得到承诺,而不是实际的响应。这就是为什么您使用await
等待响应,运行函数时就好像它是同步的,而不是异步的。
async/await
只是承诺的糖代码。如果您像这样声明一个异步函数:
async function getNumberAsync() {
return 5;
}
通过将getNumberAsync
函数声明为async
,它现在将自动返回一个承诺,该承诺将解析为本例中的数字5。
因此,您可以通过两种方式调用它:
const result = await getNumberAsync();
console.log(result);
console.log("More stuff");
或者:
getNumberAsync().then(result => {
console.log(result);
});
console.log("More stuff");
它们本质上是一样的。但是,当执行getNumberAsync().then(...)
时,这行下面的代码将立即执行并打印“更多的内容”,然后将打印5
。then
内部的代码稍后将异步地接收响应。
使用await
,该行下面的代码将在await
行获得响应之前不会执行,因此它将首先打印5
,然后打印“更多的内容”。
如果您调用getNumberAsync; function without
awaitor
.then(.)`,则不会得到结果,但将得到承诺对象:
const result = getNumberAsync();
console.log(result);```
Would print:
```js
承诺{:5}
复制
Then you can do:
```javascript
Result.then(.);
复制
or:
```javascript
Console.log(等待结果);
所以,你需要小心的时候使用它。
无论如何,我们用于智能契约测试的许多库(以及大多数其他常规库)都使用async/await/promise
来执行IO
操作,比如进行http调用等等。这样,如果不想要响应,就不会让事件循环陷入停滞,并且可以继续处理其他内容。因此,您可以选择在某个点“停止”执行并等待响应,或者使用承诺.then
回调函数在响应准备好时得到通知。
承诺来帮助“回调地狱”。async/await
来帮忙做“承诺帮助”。
检查:https://blog.avenuecode.com/callback-hell-promises-and-async/await
https://ethereum.stackexchange.com/questions/135833
复制