async/await是用来解决异步的,常用的解决异步方法是用Promise,如下:
function foo() {
return new Promise((resolve) => {
setTimeout(() => {
resolve(1)
}, 2000)
})
}
foo().then(res => {
console.log(res); // 2s后输出1
})
但是如果有很多个.then,那么看起来逻辑也很复杂了,所以可以使用async、await来解决异步,如下:
function foo1() {
return new Promise((resolve) => {
setTimeout(() => {
resolve(1)
}, 2000)
})
}
function foo2() {
return new Promise((resolve) => {
setTimeout(() => {
resolve(2)
}, 2000)
})
}
async function foo() {
const result1 = await foo1();
console.log(result1); // 2s后打印1
const result2 = await foo2();
console.log(result2); // 4s后打印2
}
console.log(foo()); // [<pending>]
如上,发现await后面总是跟着Promise,并且async函数返回的是一个Promise。
当await后面不跟Promise的时候,会立即执行,不会阻碍后面的代码。
async function foo() {
await setTimeout(() => {
console.log(1)
}, 2000);
console.log(2);
}
foo(); // 2, 1
async、await相当于是generator的语法糖,generator函数是一种特殊的函数,前面会带有一个*,它里面可以使用yield来对函数内部的执行暂停,然后返回一个{value, done}类型的对象,value表示yield后面的值,如果是函数的话会立即执行函数,将函数的返回值给value,done则表示是否走到头了,当走到最后一层的时候,done为true,value为return的值。
function * foo() {
yield 1;
yield foo1();
return 4;
}
function foo1() {
console.log(2)
return 3;
}
const gen = foo();
console.log(gen); // 生成器对象
const result = gen.next();
console.log(result, result.value); // { value: 1, done: false } 1
const result1 = gen.next();
console.log(result1, result1.value); // 2 { value: 3, done: false } 3
const result2 = gen.next();
console.log(result2, result2.value); // { value: 4, done: true } 4
可以通过next去传递参数,第一次传递参数没用,只有从第二次开始有用.从yield左边接收参数;
function* foo() {
const num = yield foo1(1);
const num1 = yield foo1(num);
const num2 = yield foo1(num1);
}
function foo1(num) {
return num*2;
}
const gen = foo();
console.log(gen.next()); // { value: 2, done: false }
console.log(gen.next(2)); // num = 2, { value: 4, false }
console.log(gen.next(4)); // num1 = 4, { value: 8, false }
console.log(gen.next()); // { value: undefine, true }
原文地址:http://www.cnblogs.com/taosifan/p/16865955.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性