如何在调用多个回调后调用函数

时间:2015-07-23 14:25:59

标签: javascript angular-promise

我需要将数据从数据库推送到一个新数组,这将返回promise对象。 5次我需要打电话。所以我这样做。

 var items = [];

 function setData() {
   facilityAPIs.getAllListItems.get({
     listName: "Samples"
   }).
   $promise.then(function(data) {
     alert("1");
     for (var j = 0; j < data.items.length; j++) {
       items.push(data.items[j]);
     }
     console.log(items);
   }).then(function() {
     facilityAPIs.getAllListItems.get({
       listName: "Controls"
     }).
     $promise.then(function(data) {
       alert("2");
       for (var j = 0; j < data.items.length; j++) {
         items.push(data.items[j]);
       }
       console.log(items);
     });
   }).then(function() {
     facilityAPIs.getAllListItems.get({
       listName: "FibroBlast"
     }).
     $promise.then(function(data) {
       alert("3");
       for (var j = 0; j < data.items.length; j++) {
         items.push(data.items[j]);
       }
       console.log(items);
     });
   }).then(function() {
     facilityAPIs.getAllListItems.get({
       listName: "pBMC"
     }).
     $promise.then(function(data) {
       alert("4");
       for (var j = 0; j < data.items.length; j++) {
         items.push(data.items[j]);
       }
       console.log(items);
     });
   }).then(function() {
     facilityAPIs.getAllListItems.get({
       listName: "iPS Cell Lines"
     }).
     $promise.then(function(data) {
       alert("5");
       for (var j = 0; j < data.items.length; j++) {
         items.push(data.items[j]);
       }
       console.log(items);
     });
   });
 }

但是如果我想在将所有数据推入其中后使用items数组,例如调用splitData(items)。我怎么能这样。谢谢。

1 个答案:

答案 0 :(得分:0)

这是这样的吗?

var items = [];

some_fn(...)
    .then(function(data) { [push data to items] })
    .then(function() {
        some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        ...use items somehow after _all_ data has been pushed to it...
    })

如果是这样,那么问题是这个“.then链”实际上不是一个链:“顶级.then”将一个接一个地执行,但是在每个链中都有你单独开始一个新的异步操作。这些中的每一个最终都会将一些数据推送到项目,但最终结果无法在最后一个“.then”中捕获。

如果您只是将多个“已履行”的回调附加到同一承诺中,并且您没有从他们那里返回承诺,那么只要您完成第一个承诺,它们就会一个接一个地执行:

promise
  .then(function() { foo; }  // will be executed when promise is fulfilled
  .then(function() { bar; }  // will be executed right after

如果在回调中运行其他异步操作,并且想要创建一个链,则需要从回调中返回一个promise:

promise
   .then(function() { return promise_foo; }  // will be executed when promise is fulfilled
   .then(function() { return promise_bar; }  // will be executed when promise_foo is fulfilled

(有关详情,请参阅spec中的承诺解决程序。)

因此原始示例可以像这样重新组织以创建单个链:

some_fn(...)
    .then(function(data) { [push data to items] })
    .then(function() {
        return some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        return some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        return some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        return some_fn(...).then(function(data) { [push data to items] });
    })
    .then(function() {
        ...all operations have finished, you can use items here...
    })