javascript - 按顺序返回 promise

标签 javascript angularjs angular-promise

我在使用 $q#all 返回 promise 时遇到问题方法。

我想做出相互依赖的 promise ,:

如果我设置 obj1、obj2 和 obj3,我想以相同的顺序获取它们。

我怎样才能做到这一点?

工厂:

mainFactory.$inject = ['$http', '$q'];

function mainFactory($http, $q) {
  var mainFactory = {
    getPromises: getPromises
  };

  return mainFactory;

  function getPromises(id) {
    promises = {
      'obj1': $http.get('http1'),
      'obj2': $http.get('http2'),
      'obj3': $http.get('http3'),
      'obj4': $http.get('http4', { params: { 'id': id } }),
      'obj5': $http.get('http5'),
      'obj6': $http.get('http6', { params: { 'id': id } })
    };

    return $q.all(promises);
  }
}

Controller :

MainCtrl.$inject = ['mainFactory'];

function MainCtrl(mainFactory) {
  var vm = this;
  mainFactory.getPromises(id)
    .then(getResponse)
    .catch(getError);

  function getResponse(response) {
    var keys = Object.keys(response), i = keys.length;
    while (i--) {
      var key = keys[i];
      console.log(key); // I want all the keys in order, i.e. => obj1, obj2.. and so on
      var value = response[key].data;
      switch(key) {
        ...
      }
    }
  }

  function getError(error) {
    console.log(error);
  }
}

编辑:

我也试过这种方式:

var promises = {};
return $http.get('/admin/http1.json').then(function (value) {
    promises['obj1'] = value;
  })
.then(function (result) {
    return $http.get('/admin/http2.json').then(function (value) {
    promises['obj2'] = value;
  });
}).then(function (result) {
    return $http.get('/admin/http3.json').then(function (value) {
    promises['obj3'] = value;
  });
});     
return $q.all(promises);

最佳答案

使用 $q.all以无特定顺序解决每个 promise 。如果您希望它们在每个 promise 被解析后执行,请使用promise chaining

function getPromises(id) {
  var getObjA = function () {
    return $http.get('http1');
  };

  var getObjB = function () {
    return $http.get('http2');
  };

  var getObjC = function () {
    return $http.get('http3');
  };

  var getObjD = function () {
    return $http.get('http4', { params: { 'id': id } });
  };

  var getObjE = function () {
    return $http.get('http5');
  };

  var getObjF = function () {
    return $http.get('http5', { params: { 'id': id } });
  };

  return getObjA()
    .then(getObjB)
    .then(getObjC)
    .then(getObjD)
    .then(getObjE)
    .then(getObjF);
}

编辑:作为附加信息,您可以通过在此处放置一个 catch 语句来捕获任何这些 promise 中的任何错误

getPromises("id")
   .then(<success callback here>)
   .catch(<error callback that will catch error on any of the promises>);

意思是,一旦 promise 失败,下面所有后续的 promise 都不会被执行,并且会被你的 catch 语句捕获

关于javascript - 按顺序返回 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38663010/

相关文章:

javascript - 在页面加载时滚动到 div

javascript - AngularJS 范围属性未定义

javascript - 为 promise.all 中的每个 promise 设置超时

angularjs - 从 promise 结果返回字符串

javascript - Modal 打开后点击 onOk 按钮

javascript - 谷歌浏览器中的 window.open 使用导致奇怪的 'tab vs new window' 行为

javascript - 如何向 Chartjs 中的插件添加第二个函数?

javascript - 将控制添加到 Bootstrap 分页中每页的行数

javascript - 当属性为 0 或以下时从数组中删除对象 - Angular

javascript - Angular 异步函数返回未定义而不是 Promise