如何在前一个承诺解决后执行承诺?

时间:2017-09-07 14:43:28

标签: javascript angularjs q

我需要在angularjs上做2个http请求,但是我需要第二个请求只在第一个请求解析后执行。 因为 - > 我需要同时返回两个请求。哪种方法最好?

我使用下面的代码进行测试,但是这两个承诺是同时执行的。我怎么能这样做,第二个承诺只在第一个承诺解决后执行?

$q.all([
    getData(api_url('categories')),
    getData(api_url('tags')), // This promise must only be executed after the promise above has been resolved

]).then(function (response) {
    $scope.categories = response[0];
    $scope.tags = response[1];

}).catch(function (error) {
    notify('Cannot get data for articles register!', 'error');
});

[更新] 我已成功解决了此代码的问题,但在我看来这不是最好的方法。如何改进此代码?

getData(api_url('categories')).then(function (response) {
    categories = response.data;

    return getData(api_url('tags')).then(function (response) {
        tags = response.data;

        $scope.categories = categories;
        $scope.tags = tags;
    });

}).catch(function (response) {
    notify('Cannot get data for articles register!', 'error');
});

[溶液]

var categoriesPromise = getData(api_url('categories'));

var tagsPromise = categoriesPromise.then(function (response) {
    return getData(api_url('tags'));
});

$q.all([categoriesPromise, tagsPromise]).then(function (response) {
    $scope.categories = response[0].data;
    $scope.tags = response[1].data;
}).catch(function (response) {
    notify('Cannot get data for articles register!', 'error')
});

1 个答案:

答案 0 :(得分:0)

这可能会更好一点?

getData(api_url('categories'))
  .then(function(response) {
    $scope.categories = response.data;

    return getData(api_url('tags'));
  }).then(function(response) {
    $scope.tags = response.data;
  }).catch(function(response) {
    notify('Cannot get data for articles register!', 'error');
  });