给出
(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
,只有传递给Promise
的{{1}}值可在
resolve()

问题:
为什么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));
调用不会传播到reject()
,而.catch()
未在Error()
内的reject()
构造函数中明确传递给Promise
async
功能?
为什么只有一个Promise
值返回.then()
,尽管当async
个对象之一迭代时,Promise
函数返回一个数组在reject()
构造函数Promise
函数中调用循环resolver
函数?
答案 0 :(得分:4)
如果我们[...]没有明确地将
Error()
传递给Promise的reject()
构造函数解析器函数.catch()
没有捕获错误
当然,因为那时没有错误。但是catch
会抓住您传递给reject
的任何内容,即值1
,它会被正确记录。
答案 1 :(得分:0)
尝试代码时,例如使用Promise
的情况,并且预计会在.catch()
记录错误,请明确传递Error()
,最好将相关消息作为参数传递给reject()
构造函数Promise
或Promise.reject()
;并使用console.error()
替换console.log()
.catch()
,以区分您希望记录为Error()
而不是已解决的Promise
的错误} value,其中已解析和拒绝的值可能恰好相同。