书接之前代码输出题目,
异步&事件循环
15.代码输出结果
function runAsync(x) {
const p = new Promise(r => setTimeout(() => r(x, console.log(x)), 1000))
return p
}
function runReject(x) {
const p = new Promise((res, rej) => setTimeout(() => rej(`Error: ${x}`, console.log(x)), 1000 * x))
return p
}
Promise.all([runAsync(1), runReject(4), runAsync(3), runReject(2)])
.then(res => console.log(res))
.catch(err => console.log(err))
输出结果如下:
1
3
2
Error: 2
4
代码执行顺序如下:
- 在这个例子中,
Promise.all
方法接受一个数组作为参数,并返回一个新的Promise
对象,该Promise
对象在所有给定的Promise
对象都被resolve
或reject
后才resolve
或reject
。对于每个传入的Promise
对象,我们使用不同的方式处理resolve
和reject
结果。对于成功的操作,我们在1秒后将数字作为resolve
参数传递给Promise
,并使用console.log
打印出来。对于失败的操作,我们在 1000 乘以失败数字的时间后,将错误消息作为reject
参数传递给Promise
,并使用console.log
打印出来。 - 由于这些操作是异步执行的,因此它们的实际执行顺序可能与它们在代码中的顺序不同。在这个例子中,我们可以看到数字1在数字4之前成功,而数字3在数字2之前成功。这是因为
Promise.all
方法会等待所有Promise对象都resolve或reject后才继续执行后续操作,因此它们的执行顺序是按照它们在数组中的顺序进行的。同时,由于失败的操作会直接reject,因此它们的结果会直接打印在控制台上,而不会等到Promise.all
方法的then
方法被调用。
16.代码输出结果
function runAsync(x) {
const p = new Promise(r => setTimeout(() => r(x, console.log(x)), 1000))
return p
}
Promise.race([runAsync(1), runAsync(2), runAsync(3)])
.then(res => console.log('result: ', res))
.catch(err => console.log(err))
输出结果如下:
1
result: 1
2
3
代码执行顺序如下:
then
只会捕获第一个成功的方法,其他的函数虽然还会继续执行,但是不是被 then
捕获了。