如何根据条件

时间:2018-01-17 06:13:45

标签: javascript angularjs lodash

我有一些API调用,当我的代码在编辑模式下执行时我只需要调用它,但我有一个特定的API调用,必须在创建和编辑两种模式下进行。

以下是我现在编写的代码:

// other controller code
var config = {};

var image = {
  dc: { name: 'abc' },
  cl: { name: 'def' },
  ds: { name: 'ghi' },
  net: { name: 'jkl' }
};

// Turns on the loader
vm.loading = true;

// I'll always have to get list of DCs, be it create or edit mode
promise = getDc()
  .then(function(response) {
    config.dc = response.data.dc;
    return $q.resolve(response.data.dc);
  }, function() {
    return $q.reject('Failed to get DCs');
  })

// If edit mode, I need to fetch list of Cls, Nets and DSs.
// These all are dependent on list of DCs.
if (editMode) {
  promise
    .then(function(dcs) {
      image.dc = _.find(dcs, { name: image.dc.name });

      return $q.all([
          getCl(image.dc),
          getNet(image.dc)
        ])
        .then(function(response) {
          config.cl = response[0].data.cls;
          config.net = response[1].data.nets;

          return $q.resolve([response[0].data.cls, response[1].data.nets]);
        }, function() {
          return $q.reject('Failed to get cls or nets');
        });
    })
    .then(function(lists) {
      image.cl = _.find(lists[0], { name: image.cl.name });
      image.net = _.find(lists[1], { name: image.net.name });

      return getDs(image.dc, image.cl)
        .then(function(response) {
          config.ds = response.data.ds;

          return $q.resolve(response.data.ds);
        }, function() {
          return $q.reject('Failed to get DSs');
        });
    })
    .then(function(dss) {
      image.ds = _.find(dss, { name: image.ds.name });
      return $q.resolve();
    });
}

promise
  .then(function() {
    // Will open modal here
  })
  .catch(function(error) {
    // Print any error thrown in between
    console.error(error);
  })
  .finally(function() {
    // Turns off the loader
    vm.loading = false;
  });

因此,在创建模式下,我将在获取DC后直接打开模态,但在编辑模式下,我还需要加载其他几个。

这里的问题是加载器仅在DC加载之前显示,并且在此之后打开模态。它不会等待首先加载其他元素。

任何线索?

1 个答案:

答案 0 :(得分:3)

您在if (editMode) {之后创建的承诺链是从您的原始承诺派生而来的,但它不会取代它。整个链的执行独立于if()条件之后定义的逻辑。要解决问题,请重新分配承诺:

if (editMode) {
  promise = promise
    .then(function(dcs) {
    ...
}