链接异步函数?
Chaining async functions?
let val = 0;
async function first() {
console.log('1a', val);
second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
third();
console.log('2b', val);
}
async function third() {
console.log('3a', val);
val = await new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(3);
}, 1000);
});
console.log('3b', val);
}
console.log('0a', val);
first();
console.log('0b', val);
我期待:
0a 0
1a 0
2a 0
3a 0
3b 3
2b 3
1b 3
0b 3
但我收到了:
0a 0
1a 0
2a 0
3a 0
2b 0
1b 0
0b 0
3b 3
我猜我不知道关于异步的一个基本问题?
您将必须 await
所有异步函数调用:
async function first() {
console.log('1a', val);
await second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
console.log('2b', val);
}
您将需要使用
async function first() {
console.log('1a', val);
await second();
// ^^^^^
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
// ^^^^^
console.log('2b', val);
}
在被调用函数异步执行后链接 b
日志。
也是一样
console.log('0a', val);
first();
console.log('0b', val);
只是你不能在这里使用 await
,因为你不在 aync function
中。创建一个函数 async
并不意味着它神奇地阻止了它内部的所有异步操作,相反 - 它的结果变成了一个 always 异步的承诺,你可以使用await
关键字。所以要让 0b
等待,您可以使用
console.log('0a', val);
first().then(function() {
console.log('0b', val);
}, function(err) {
console.error(err);
});
或
(async function() {
try {
console.log('0a', val);
first();
console.log('0b', val);
} catch(err) {
console.log(err);
}
}());
let val = 0;
async function first() {
console.log('1a', val);
second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
third();
console.log('2b', val);
}
async function third() {
console.log('3a', val);
val = await new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(3);
}, 1000);
});
console.log('3b', val);
}
console.log('0a', val);
first();
console.log('0b', val);
我期待:
0a 0
1a 0
2a 0
3a 0
3b 3
2b 3
1b 3
0b 3
但我收到了:
0a 0
1a 0
2a 0
3a 0
2b 0
1b 0
0b 0
3b 3
我猜我不知道关于异步的一个基本问题?
您将必须 await
所有异步函数调用:
async function first() {
console.log('1a', val);
await second();
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
console.log('2b', val);
}
您将需要使用
async function first() {
console.log('1a', val);
await second();
// ^^^^^
console.log('1b', val);
}
async function second() {
console.log('2a', val);
await third();
// ^^^^^
console.log('2b', val);
}
在被调用函数异步执行后链接 b
日志。
console.log('0a', val);
first();
console.log('0b', val);
只是你不能在这里使用 await
,因为你不在 aync function
中。创建一个函数 async
并不意味着它神奇地阻止了它内部的所有异步操作,相反 - 它的结果变成了一个 always 异步的承诺,你可以使用await
关键字。所以要让 0b
等待,您可以使用
console.log('0a', val);
first().then(function() {
console.log('0b', val);
}, function(err) {
console.error(err);
});
或
(async function() {
try {
console.log('0a', val);
first();
console.log('0b', val);
} catch(err) {
console.log(err);
}
}());