繁体   English   中英

Promise.all()数组

[英]array of promises and Promise.all()

我有这样的承诺数组:

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];

我想全部执行它们,并捕获这样的错误

Promise.all(promisesArray)
    .then(() => doStuffs())
    .catch((err) => handleError(err));

那很好,但是我现在想在另一个promise的then()中做到这一点:

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): ...

但是我想使用最后一个解决方案,因为我的数组是根据某些条件通过将Promises推入数组而生成的。 (第一个示例工作得很好,我没有什么不同)

在将每个promise添加到数组中的同时,将捕获添加到我的每个promise中可以解决我的问题,但是我想找到一个更好的解决方案。

我真的很感谢您的帮助。

PS:如果更改了某些内容,我将在zone2.js中使用angular2

一旦执行了异步函数(一个返回诺言的函数),它就会开始在后台运行(种类)任务,该诺言可能会在您运行后的任何时间解析或拒绝

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];

这些服务将关闭并加载数据,如果它们在附加.then()之前返回,它们将保持其值,并在您调用promisesArray [0] .then(x => console.log(x))时立即保留。 then函数将使用该值运行

但是,如果这些服务之一引发错误并且尚不附加.catch函数,它们将保留该错误以便将其发送到以后指定的.catch()函数,但是它们还会引发控制台错误-因为他们不知道是否会附加catch函数,如果诺言只是默默地失败并且错误消失了,那将是令人沮丧的。

如果您确实希望您的promisesArray执行AFTER baseService(),那么您的想法就是使promisesArray成为启动异步任务并返回promise的函数数组。 但是,最好传递一个返回一个promise数组的函数,而不是传递一个返回一个promise的函数数组(如上所述)。

const getPromises = () => [
    service1.load('blabla'),
    service2.load(), // throws an errors
]

然后执行

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

这只会在baseServce()完成后启动您的service1.load,并且所有错误一旦发生就会被捕获。

由于您使用的是angular2,为什么不使用Observable和Http呢

var load1 = http.get('url1'),
    load2 = http.get('url2'),
    load3 = http.get('url3');

Observable.forkJoin(load1, load2, load2, function(res1, res2, res3){
    // manipulate your results here and return the reduced result

    return { whatever : { res1: res1, res2: res2, res3: res3 } }

}).
subscribe(function(finalResult){
     console.log(finalResult); // { whatever : { res1: res1, res2: res2, res3: res3 } }
});

我想出了一种使它起作用的方法。

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

let promisesArray = [
    () => service1.load('blabla'),
    () => service2.load(), // throws an errors
];
promisesArray.push(() => service2.load())

然后,我使用Array.prototype.map()Promise.all()运行promises:

baseService()
    .then(() => Promise.all(promisesArray.map(promise => promise())))
    .catch((err) => handleError(err));

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM