【发布时间】:2017-08-07 22:41:04
【问题描述】:
背景
我有许多函数可能会或可能不会返回 Promise,并且可能会或可能不会失败,如下例所示:
let goodFun = (fruit) => `I like ${fruit}`;
let badFun = (fruit) => {
throw `${fruit} is spoiled!`;
};
let badPromise = (fruit) => new Promise( (fulfil, reject) => {
reject(`Promise failed with ${fruit}`);
});
let goodPromise = (fruit) => new Promise((fulfil, reject) => {
fulfil(`Promise succeeded with ${fruit}`);
});
因为每个函数可能会或可能不会返回一个可能会或可能不会失败的承诺,所以我从 another StackOverflow post 修改了 executeSafe,它接受一个函数及其参数作为参数,然后 Promisifies 函数及其结果:
let executeSafe =
(fun, ...args) => Promise.resolve().then(() => {
return fun(...args);
});
我对所有这些的目标是拥有一个 asyncFun 函数,该函数等待执行已承诺的一批函数,然后返回执行它们的任何内容:
let asyncFun =
(fruit) =>
Promise.all([badFun, goodFun, badPromise, goodPromise].map(
fun => executeSafe(fun, fruit)
)
);
问题
asyncFun 旨在运行前面描述的众多功能,其中一些我实际上预计会失败。为了适应这一点,我的asyncFun 函数有一个catch 子句。该子句仅适用于badFun,不适用于badPromise。 then 子句永远不会起作用。
let executor = () => {
let fruitsArr = ["banana", "orange", "apple"];
let results = [];
for (let fruit of fruitsArr)
results.push(
asyncFun(fruit)
.then(res => {
console.log(res);
})
.catch(error => {
console.log(`Error: ${error}`);
})
);
return Promise.all(results);
};
即使将catch 子句放在执行程序的调用中,也不会捕获除badFun 错误之外的任何其他内容。
executor()
.catch(error => console.log("Failed miserably to catch error!"));
代码
let goodFun = (fruit) => {
return `I like ${fruit}`;
};
let badFun = (fruit) => {
throw `${fruit} is spoiled!`;
};
let badPromise = (fruit) => Promise.resolve().then(() => {
throw `Promise failed with ${fruit}`;
});
let goodPromise = (fruit) => Promise.resolve().then(() => {
return `Promise succeded with ${fruit}`;
});
let executeSafe =
(fun, ...args) => Promise.resolve().then(() => {
return fun(...args);
});
let asyncFun = (fruit) => Promise.all([badFun, goodFun, badPromise, goodPromise].map(fun => executeSafe(fun, fruit)));
let executor = () => {
let fruitsArr = ["banana", "orange", "apple"];
let results = [];
for (let fruit of fruitsArr)
results.push(
asyncFun(fruit)
.then(res => {
console.log(res);
})
.catch(error => {
console.log(`Error: ${error}`);
})
);
return Promise.all(results);
};
executor()
.catch(error => console.log("Failed miserably to catch error!"));
问题:
- 如何修复我的代码,使其
asyncFun中的then和catch子句按预期工作?
【问题讨论】:
-
这真的很令人困惑,我根本不会争辩它是如何完成的。为什么要调用
Promise.resolve().then而不是使用 Promise 构造函数?您在内部异步调用中catching 但没有重新抛出,外部catch将如何做任何事情? -
至于
Promise.resolvedeveloper.mozilla.org/en/docs/Web/JavaScript/Reference/… -
executor catch 理想情况下不会捕获任何东西,因为
asynFuncatch 会完成所有工作。但是,它们都不起作用。 -
我知道它是如何/为什么工作的,但它不寻常的意思是任何习惯使用 Promises 的人都很难阅读你的代码。
-
我愿意接受建议,如果您认为 Promisify 函数有更好的方法,我会全力以赴!
标签: javascript node.js promise es6-promise