Node-JS专精11_04async_await问题

问题整理

async / await 是 promise 的语法糖如何用 promise 实现 async/await

  • 答:有的语法糖好改写,有的语法糖不好改写。这个语法糖就不好改写,因为这是语言层面的改动,而不是API层面的。可以举例说明
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// API层面语法糖
如 promise 的 catch 改写成 promise.then(null,fn)



// await 改写
async function fn(){
const res = await ajax();
console.log(res)
}

function fn2(){
ajax().then((res)=>{
console.log(res)
})
}

有些 await 需要等待上一个 await 的结果,有些不用,如何让不用同步的 await 异步执行

  • 答:其实非常简单
1
2
3
4
5
6
7
8
9
10
11
12
13
async function fn(){
await getUser()
await getProducts();
// 你想要 getOthers 不等前两个同步结果,非常简单 把它放到 前面就行了
getOthers();
}

// 处理方式
async function fn2(){
getOthers();
await getUser()
await getProducts();
}

如何实现一个监控,调用异步请求一直等待,监控某个值变了就执行回调

  • 答:不太清楚你的场景,不过 Vue2 已经做到了这一点,用 Object.defineProperty ,也可以用Proxy方案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
ajax = function(){
return new Promise((resolve,reject)=>{
resolve({
data:{name:'a'}
})
})
}

var data ={
name:'sss'
}

var vm = {}

Object.defineProperty(vm,'name',{
set(newValue){
data.name = newValue
},
get(){
return data.name
}
})

ajax().then(res=>{
console.log(res.data);
vm.name = res.data.name
})

代码题

1
2
3
4
5
6
7
8
9
10
let a = 0;
let test = async()=>{
a = a + await 10;
console.log(a)
}

test();
console.log(++a);

// test 是个异步的 所以不会执行 先去打印
  • 答:倒数第二行有坑
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
答案是 
1
10

为什么?是10 你一定认为是 11

// 改写下代码继续运行 打印 test时 a +
let a = 0;
let test = async()=>{
a = (console.log('a:'+ a),a) + await 10;
console.log(a)
}

test();
console.log(++a);

// 原因就是 我们一直认为 await 的右边会立刻执行 await 是等一会执行的
但是如果他用 加号的时候 就不能这样算 因为你不是 `a + await 10` 而是先确定 a的值

题外话

只有在一行代码的情况下

  • 用 await 最好的
  • 如果情况变复杂了,还是要 Promise
  • 并行的情况,也要用 Promise.all