问题场景:
nodejs,koa
有一个商品表和一个订单表,浏览器发送一次创建新订单请求.
该请求数组,元素由商品id和商品数量组成,服务端接收后,查商品表,更新每个商品总数
开始用的foreach,报语法错误浏览器可能不报错但不是期望效果,原因如下
foreach是同步执行,async是异步的
比如示例代码
function test() {
let arr = [3, 2, 1]
arr.forEach(async item => {
const res = await fetch(item)
console.log(res)
})
console.log('end')
}
function fetch(x) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve(x)
}, 500 * x)
})
}
test()
解决办法
1.不在意执行顺序
用map转成一个存放promise数组,然后promise.all执行
async function test() {
let arr = [3, 2, 1]
await Promise.all(
arr.map(async item => {
const res = await fetch(item)
console.log(res)
})
)
console.log('end')
}
2.在意执行顺序
采用for of,或者for循环
for of主要是迭代遍历目标
async function test() {
let arr = [3, 2, 1]
for (const item of arr) {
const res = await fetch(item)
console.log(res)
}
console.log('end')
}
参考博客
博客一
博客二
额外的:for of和for in的区别
for in循环可枚举属性,for of只循环可迭代的属性值
Object.prototype.objCustom = function () {};
Array.prototype.arrCustom = function () {};
let iterable = [3, 5, 7];
iterable.foo = "hello";
for (let i in iterable) {
console.log(i); // logs 0, 1, 2, "foo", "arrCustom", "objCustom"
}
for (let i of iterable) {
console.log(i); // logs 3, 5, 7
}