关于async
和await
使用
个人理解:在每一个函数前面的都加上async
,函数内部,如果是异步操作,直接在其前面加上await
即可,等待一步函数执行的结果。await
后面可以接任何变量,可以是常量或者promise
。async
修饰的函数自动变成一个promise
.正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。
//经过async修饰之后,自动变成promise对象
async function f() {
return 'hello world';
}
f().then(v => console.log(v))
// "hello world"
async function f() {
return await 123;
}
f().then(v => console.log(v))
// 123
//错误处理
async function f() {
throw new Error('出错了');
}
f().then(
v => console.log(v),
e => console.log(e)
)
// Error: 出错了
async
中错误处理
//使用catch捕捉错误
async function f() {
await Promise.reject('出错了');
}
f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出错了
async function main() {
try {
var val1 = await firstStep();
var val2 = await secondStep(val1);
var val3 = await thirdStep(val1, val2);
console.log('Final: ', val3);
}
catch (err) {
console.error(err);
}
}
//使用async控制指定时间打印
function timeout(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function asyncPrint(value, ms) {
await timeout(ms);
console.log(value)
}
asyncPrint('hello world', 50);
多种形式
const foo = async function(){}
async function foo(){}
const foo = async () => {};
并发处理
let foo = await getFoo();
let bar = await getBar();
//======================
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
//使用下面的方式是,使一步操作同时触发。最上面的方式是同步执行。
//并发执行的方式选择
async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc));
let results = await Promise.all(promises);
console.log(results);
}
// 或者使用下面的写法
//使用for循环控制了使用await的时间
async function dbFuc(db) {
let docs = [{}, {}, {}];
let promises = docs.map((doc) => db.post(doc));
let results = [];
for (let promise of promises) {
results.push(await promise);
}
console.log(results);
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。