网站首页 > 技术文章 正文
1. 异步函数被调用后会先后返回两个值,第一个返回值是一个promise对象(在异步函数被调用后立即返回),第二个返回值是异步函数return语句的返回值。第二个返回值将成为第一个返回值promise对象的value属性值。
MDN Web Docs是这样描述异步函数的返回值:
instead of immediately returning the final value, the asynchronous method returns a promise to supply the value at some point in the future.
示例代码如下所示:
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);
示例代码的运行结果如下所示:
2. await后面一般紧跟一个promise对象或一个异步函数的调用。因为一个异步函数调用的返回值是一个promise对象,所以,await后面紧跟一个异步函数调用,本质就是await后面紧跟一个promise对象,即:await 异步函数名() = await 一个promise对象 。
3. "await 一个promise对象" 将获得这个promise对象状态为fulfilled或rejected时value属性值。"await 异步函数名()" 将获得这个异步函数第二次返回的返回值(即return语句的返回值)。
示例代码1:
async function hello() { return "Hello" };
async function handleHello() {
// hello()的值是hello()第一次的返回值(即是一个promise对象)
// 而await hello()的值是hello()第二次的返回值(即return语句的返回值)
let result = await hello();
console.log({result: result}); // output: Hello
}
handleHello();
示例代码2
async function hello() { return "Hello" }
async function handleHello() {
let firstReturnValue = hello()
let secondReturnValue = await firstReturnValue
console.log({
firstReturnValue: firstReturnValue,
secondReturnValue: secondReturnValue
})
}
handleHello()
4. await是阻塞等待的,等待一个promise对象的状态由pending变为fulfilled或rejected,或者说,等待一个promise对象被resolve或reject。
5. Promise.prototype.then()是阻塞等待的,等待一个promise对象的状态由pending变为fulfilled或rejected,或者说,等待一个promise对象被resolve或reject。
6. 使用async关键字声明一个函数为异步函数,在异步函数内和模块顶层才能使用await关键字,否则就会报错。
MDN Web Docs是这样描述的:
await is only valid in async functions and the top level bodies of modules.
7. 创建promise对象时回调函数里的参数resolve和reject是由JavaScript engine预定义的函数。
const testPromise = new Promise((resolve, reject) => {
// 这里的resolve和reject是由JavaScript engine预定义的函数
setTimeout(() => {
resolve('testPromise');
}, 5000);
});
8. Promise.prototype.then(callback1, callback2)的返回值是一个promise对象,这个promise对象是resolve到then(callback1, callback2)中callback1或callback2的返回值,就看是callback1被调用了还是callback2被调用了。
示例代码如下所示:
Promise.resolve('success').then(() => 1, () => 2)
Promise.reject('fail').then(() => 1, () => 2)
- await 一个promise对象
与
一个promise对象.then(resolvedCallback, rejectedCallback)
是等价的,都在阻塞等待一个promise对象的状态由pending变为fulfiled或rejected,然后对这个promise对象的状态为fulfiled或rejected的属性值进行相关后续处理。
其中,.then(),当这个promise对象的状态为fulfiled时则调用resolvedCallback处理,当这个promise对象的状态为rejected时则调用rejectedCallback处理。
猜你喜欢
- 2024-11-12 前端如何操作文件夹 文件 写入??? #每天一个小知识
- 2024-11-12 手把手教你JS实现魔方模拟器 魔方模拟软件
- 2024-11-12 距离 JS 大神 你还有多远? js计算距离
- 2024-11-12 React Hooks中这样写HTTP请求可以避免内存泄漏
- 2024-11-12 由一道题彻底弄懂 JavaScript继承
- 2024-11-12 JavaScript 错误处理大全「值得收藏」
- 2024-11-12 七爪源码:JavaScript 异步编程演进
- 2024-11-12 强烈推荐用1.2kb 的 idb 来管理 IndexedDB
- 2024-11-12 手把手教你全面分析前端如何网络请求方式
- 2024-11-12 2.6万字JS干货分享,带你领略前端魅力【实践篇】
- 标签列表
-
- content-disposition (47)
- nth-child (56)
- math.pow (44)
- 原型和原型链 (63)
- canvas mdn (36)
- css @media (49)
- promise mdn (39)
- readasdataurl (52)
- if-modified-since (49)
- css ::after (50)
- border-image-slice (40)
- flex mdn (37)
- .join (41)
- function.apply (60)
- input type number (64)
- weakmap (62)
- js arguments (45)
- js delete方法 (61)
- blob type (44)
- math.max.apply (51)
- js (44)
- firefox 3 (47)
- cssbox-sizing (52)
- js删除 (49)
- js for continue (56)
- 最新留言
-