javascript异步函数的返回值是什么?
<p>1. 异步函数被调用后会先后返回两个值,第一个返回值是一个promise对象(在异步函数被调用后立即返回),第二个返回值是异步函数return语句的返回值。第二个返回值将成为第一个返回值promise对象的value属性值。<br>MDN Web Docs是这样描述异步函数的返回值:</p><blockquote>
<p>instead of immediately returning the final value, the asynchronous method returns a promise to supply the value at some point in the future.</p>
</blockquote>
<p>示例代码如下所示:</p>
<pre class="language-javascript"><code>function sleep (time) {
return new Promise((resolve) => setTimeout(resolve, time));
}
async function test_async() {
console.log('start time: ' + new Date());
await sleep(20000);
console.log('finish time: ' + new Date());
return 'hello world';
}
var o = test_async();
console.log(o);</code></pre>
<p>示例代码的运行结果如下所示:</p>
<p><img src="https://img2022.cnblogs.com/blog/2820530/202203/2820530-20220331174107564-901932752.png"></p>
<p id="1648719671640"></p>
<p> </p>
<p>2. await后面通常紧跟一个promise对象或一个异步函数的调用。因为一个异步函数调用的返回值是一个promise对象,所以,await后面紧跟一个异步函数调用,本质就是await后面紧跟一个promise对象,即:await 异步函数名() = await 一个promise对象 。</p>
<p> </p>
<p>3. "<em><span style="text-decoration: underline">await 一个promise对象</span></em>" 将获得这个promise对象状态为fulfilled或rejected时value属性值。"<em><span style="text-decoration: underline">await 异步函数名()</span></em>" 将获得这个异步函数第二次返回的返回值(即return语句的返回值)。</p>
<p>示例代码如下所示:</p>
<pre class="language-javascript"><code>async function hello() { return "Hello" };
async function handleHello() {
// hello()的值是hello()第一次的返回值(即是一个promise对象)
// 而await hello()的值是hello()第二次的返回值(即return语句的返回值)
let result = await hello();
console.log(result);// output: Hello
}
handleHello();</code></pre>
<p> </p>
<p>4. await是阻塞等待的,等待一个promise对象的状态由pending变为fulfilled或rejected,或者说,等待一个promise对象被resolve或reject。</p>
<p> </p>
<p>5. Promise.prototype.then()是阻塞等待的,等待一个promise对象的状态由pending变为fulfilled或rejected,或者说,等待一个promise对象被resolve或reject。</p>
<p> </p>
<p>6. 使用async关键字声明一个函数为异步函数,在异步函数内和模块顶层才能使用await关键字,否则就会报错。<br>MDN Web Docs是这样描述的:</p>
<blockquote>
<p>await is only valid in async functions and the top level bodies of modules.</p>
</blockquote>
<p> </p>
<p>7. 创建promise对象时回调函数里的参数resolve和reject是由JavaScript engine预定义的函数。</p>
<pre class="language-javascript"><code>const testPromise = new Promise((resolve, reject) => {
// 这里的resolve和reject是由JavaScript engine预定义的函数
setTimeout(() => {
resolve('testPromise');
}, 5000);
});</code></pre>
<p> </p>
<p>8. Promise.prototype.then(callback1, callback2)的返回值是一个promise对象,这个promise对象是resolve到then(callback1, callback2)中callback1或callback2的返回值,就看是callback1被调用了还是callback2被调用了。</p>
<p>示例代码如下所示:</p>
<pre class="language-javascript"><code>Promise.resolve('success').then(() => 1, () => 2)
Promise.reject('fail').then(() => 1, () => 2)</code></pre>
<p><img src="https://img2022.cnblogs.com/blog/2820530/202203/2820530-20220331180725217-1671831403.png"></p>
<p id="1648721246772"></p>
<p id="1648721209015"></p>
<p> </p>
<p>参考文档:<br>https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise<br>https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await</p>
<p> </p><br><br>
来源:https://www.cnblogs.com/thinkdecideact/p/16083033.html
頁:
[1]