仅在if语句中完成所有异步回调之后才起作用

时间:2017-09-28 08:12:21

标签: javascript typescript asynchronous

我希望在完成异步函数的所有回调时关闭一些页面,但并非所有 (let [args (mapv #(list 'func (:service 'event) %) service-list) form (list 'project args (...))] (eval form)) 语句都可能为真。现在它看起来像这样:

if()

2 个答案:

答案 0 :(得分:2)

您可以使用Promise.all

var promises = [];

if (this.originalFrom > addFrom) {
    promises.push(this.dataService.addTimeSlots(details));
}

if (this.originalTo < addTo) {
    promises.push(this.dataService.addTimeSlots(details2));
} else if (this.originalTo > addTo) {
    promises.push(this.dataService.addTimeSlots(details3));
}

Promise.all(promises).then((result) => {
    console.log(result);
}, (err) => {
    console.log(err);
});

答案 1 :(得分:1)

您要做的是在完成所有回调后调用该函数。如果一个if语句返回false,那么你想抓住整个过程。

执行此操作的一种较差方法是将回调嵌套为以下格式:

  1 if (this.originalFrom > addFrom) {
  2     this.dataService.addTimeSlots(details).then((result) => {
  3         console.log(result);
  4         if (this.originalTo < addTo) {
  5             this.dataService.addTimeSlots(details2).then((result) => {
  6                 console.log(result);
  7                 if (this.originalTo > addTo) {
  8                     this.dataService.addTimeSlots(details3).then((result) => {
  9                         console.log(result);
 10                         some_Page_Closing_Function_When_All_Callbacks_Are_Done();
 11                     }, (err) => {
 12                         console.log(err);
 13                     });
 14                 }
 15             }, (err) => {
 16                 console.log(err);
 17             });
 18         }
 19
 20     }, (err) => {
 21         console.log(err);
 22     });
 23 }

然而,这被称为回调地狱。详细,不可读,不可维护的spagetti代码。

您可以尝试将anonymouse函数转换为命名函数,以获得更易读的解决方案。这仍然是一种hacky。

https://github.com/caolan/async

https://caolan.github.io/async/

您可以使用此库来避免上述回调地狱。