Javascript 承诺和承诺的数组。all()

Javascript 承诺和承诺的数组。all(),javascript,arrays,angular,promise,zonejs,Javascript,Arrays,Angular,Promise,Zonejs,我有一系列的承诺,比如: let promisesArray = [ service1.load('blabla'), service2.load(), // throws an errors ]; 我想把它们全部执行,然后像这样捕捉它们的错误 Promise.all(promisesArray) .then(() => doStuffs()) .catch((err) => handleError(err)); 这很好,但我现在想在另一个承诺中说

我有一系列的承诺,比如:

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];
我想把它们全部执行,然后像这样捕捉它们的错误

Promise.all(promisesArray)
    .then(() => doStuffs())
    .catch((err) => handleError(err));
这很好,但我现在想在另一个承诺中说明这一点:

baseService()
    .then(() => Promise.all([
        service1.load('blabla'),
        service2.load(), // throw an errors
    ]))
    .catch((err) => handleError(err));
只要我在Promise.all()中直接编写数组,这个也可以,但是如果我想使用
promiseArray
定义,就像:

baseService()
    .then(() => Promise.all(promisesArray))
    .catch((err) => handleError(err));
然后,
catch()

publish.js:45784 EXCEPTION: Error: Uncaught (in promise): ...
但是我想使用最后一个解决方案,因为我的数组是根据一些条件生成的,通过将承诺推给它。(第一个例子很好,我不知道有什么不同)

将捕获添加到我的每一个承诺中,同时将它们添加到阵列中,可以解决我的问题,但我想找到更好的解决方案

我真的很感激你能帮我


PS:我在zone.js中使用angular2,如果它改变了一些东西,既然你在使用angular2,为什么不使用Observable and


既然您使用的是angular2,为什么不使用Observable and


我想出了一个办法让它发挥作用

我创建了一个返回承诺的函数数组,而不是承诺数组:

let promisesArray = [
    () => service1.load('blabla'),
    () => service2.load(), // throws an errors
];
promisesArray.push(() => service2.load())
然后我使用
Array.prototype.map()
运行
Promise.all()
中的承诺:

这解决了我的问题,但不确定这是否是最好的方法。
如果有人有更好的主意,我就接受。

我想出了一个办法让它发挥作用

我创建了一个返回承诺的函数数组,而不是承诺数组:

let promisesArray = [
    () => service1.load('blabla'),
    () => service2.load(), // throws an errors
];
promisesArray.push(() => service2.load())
然后我使用
Array.prototype.map()
运行
Promise.all()
中的承诺:

这解决了我的问题,但不确定这是否是最好的方法。
如果有人有更好的主意,我会接受。

一旦执行异步函数(返回承诺的函数),它就开始在后台运行任务(某种程度上),从运行时起,承诺可能会在任何时候解决或拒绝

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];
这些服务正在关闭并加载数据,如果它们在附加.then()之前返回,它们将保留其值,并且只要您调用promisesArray[0]。那么(x=>console.log(x))then函数将使用该值运行

但是,如果这些服务中的一个抛出错误,并且还没有附加.catch函数,它们将保留该错误,以便稍后将其发送到指定的.catch()函数,但它们也会抛出控制台错误,因为它们不知道是否会附加catch函数,如果承诺只是默默地失败,错误消失,那将是令人沮丧的

如果您确实希望promisesArray在baseService()之后执行,那么让promisesArray成为启动异步任务并返回承诺的函数数组的想法是很好的。 但是,传入一个返回承诺数组的函数可能比传入一个返回承诺数组的函数更好(如上所述)

然后使用

baseService()
    .then(() => Promise.all(getPromises()))
    .catch((err) => handleError(err));

这只会在baseServce()完成后启动您的服务1.load,所有错误一旦发生就会被捕获。当您执行异步函数(返回承诺的函数)时,它会在后台运行任务(某种程度上),从您运行时起,承诺可能会在任何时候解决或拒绝该任务

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];
这些服务正在关闭并加载数据,如果它们在附加.then()之前返回,它们将保留其值,并且只要您调用promisesArray[0]。那么(x=>console.log(x))then函数将使用该值运行

但是,如果这些服务中的一个抛出错误,并且还没有附加.catch函数,它们将保留该错误,以便稍后将其发送到指定的.catch()函数,但它们也会抛出控制台错误,因为它们不知道是否会附加catch函数,如果承诺只是默默地失败,错误消失,那将是令人沮丧的

如果您确实希望promisesArray在baseService()之后执行,那么让promisesArray成为启动异步任务并返回承诺的函数数组的想法是很好的。 但是,传入一个返回承诺数组的函数可能比传入一个返回承诺数组的函数更好(如上所述)

然后使用

baseService()
    .then(() => Promise.all(getPromises()))
    .catch((err) => handleError(err));

这将仅在baseServce()完成后启动您的服务1.load,所有错误一出现就会被捕获,这将避免我的问题,但这将对我的服务进行一些更改。我宁愿在遵守承诺的同时修复它——我真的希望了解最后两个示例之间的实际区别。这将避免我的问题,但这将是我服务的一些变化。我宁愿在遵守承诺的同时修复它——我真的很想了解最后两个示例之间的实际区别。请告诉我们您是如何创建
promisesArray
。也许可以看一看,请告诉我们您是如何创建promisesArray的。也许看看这是否是一个解决方案(我不知道问题所在),至少不要称它为
promisesArray
,而是
factoryArray
actionsArray
loadFns
或任何合适的方法。或者,只声明一个返回承诺数组的函数,这可能是一个更好的主意。如果这是一个解决方案(我不知道问题所在),至少不要称它为
promisesArray
,而是
factoryArray
actionsArray
loadFns
或任何合适的方法。或者,只声明一个返回承诺数组的函数,这可能是一个更好的主意。