【发布时间】:2018-01-07 21:37:39
【问题描述】:
给定
(async () => {
const p = await new Promise((resolve, reject) => setTimeout(() => {
reject(new Error(1))
}, Math.floor(Math.random() * 1000))); return p})()
.then(data => console.log(data))
.catch(err => console.error(err));
Error() 记录在 .catch()
如果我们扩展模式以使用循环,Error 将记录在 .catch()
const fn = async(res, ...props) => {
for (let prop of props) res.push(await prop())
return res
}
const arr = [
() =>
new Promise((resolve, reject) =>
setTimeout(() =>
reject(new Error(1))
, Math.floor(Math.random() * 1000))
),
() =>
new Promise((resolve, reject) =>
setTimeout(() =>
resolve(1)
, Math.floor(Math.random() * 1000))
)
];
fn([], ...arr)
.then(data => console.log(data))
.catch(err => console.log(err));
如果我们使用循环调用多个返回 Promise 的函数并且没有明确地将 Error() 传递给 reject() 的 Promise 构造函数 resolver 函数 .catch() 不会捕获错误,并且数组res 没有返回,只有传递给resolve() 的Promise 值可在
const fn = async(res, ...props) => {
for (let prop of props) res.push(await prop())
return res
}
const arr = [
() =>
new Promise((resolve, reject) =>
setTimeout(() =>
reject(1)
, Math.floor(Math.random() * 1000))
),
() =>
new Promise((resolve, reject) =>
setTimeout(() =>
resolve(1)
, Math.floor(Math.random() * 1000))
)
];
fn([], ...arr)
// what happened to our array `res` returned from `fn`?
.then(data => console.log(data))
// what happened to our rejected Promise?
.catch(err => console.log(err));
问题:
-
当
Error()没有显式传递给Promise内的Promise构造函数中的Promise构造函数时,reject()调用为什么不会传播到.catch()? 为什么只有一个
Promise值返回到.then(),尽管当在循环中调用reject()函数中的一个Promise对象之一时从async函数返回一个数组Promise构造函数resolver函数?
【问题讨论】:
-
-
@JaromandaX 在
.catch()使用console.error()而不是console.log()的充分理由。您可以发表您的评论作为答案吗?
标签: javascript promise async-await ecmascript-2017