同步多个Js请求

Syncronization of Multiple Js requests

本文关键字:请求 Js 同步      更新时间:2023-12-16

我在AngularJS中尝试同步多个异步请求时遇到一些问题。我要解释一下我有什么,我需要什么。

  • 用户有许多站点
  • 每个网站都有许多订阅
  • 每个站点都有许多交易
  • 每个事务都与一个订阅相关联

我通过第三方API获取订阅和交易。它们中的每一个都返回和具有关联Id的元素数组。因此,我需要为每个数组的每个元素发出一个请求,并将两个结果关联起来。

我不知道该怎么办,也不知道该如何处理。任何帮助都将不胜感激。

$q.all([
    PaymentService.getTransactions(profile.payment.account_code),
    SiteService.getAll(),
    PaymentService.getUserSubscriptions(profile.payment.account_code)
  ]).then(function (data) {
    var transactions = data[0];
    var user_sites = data[1];
    var user_subscriptions = data[2];
    // returns site-by-site
    angular.forEach(user_sites, function (site) {
      SiteService.loadSite(site.$value).then(function (loaded_site) {
        loaded_site.transactions = [];
        loaded_site.subscriptions = [];
        angular.forEach(user_subscriptions, function (subscription) {
          console.log('SUBSCRIPTION: ', subscription);
          if ( subscription.uuid === loaded_site.recurly_subscription_uuid ) {
            loaded_site.subscriptions.push(subscription);
          }
        });
        angular.forEach(transactions, function (transaction) {
          if ( transaction.subscription ) {
            if ( getSubscriptionId(transaction.subscription.$.href) === loaded_site.recurly_subscription_uuid ) {
              loaded_site.transactions.push(transaction);
            }
          }
        });
        $scope.sites.push(loaded_site);
      });
    });
  })

您可以重新应用$q.all技术:

$q.all([
    PaymentService.getTransactions(profile.payment.account_code),
    SiteService.getAll(),
    PaymentService.getUserSubscriptions(profile.payment.account_code)
  ]).then(function (data) {
    var transactions = data[0];
    var user_sites = data[1];
    var user_subscriptions = data[2];
    var promises = [];
    angular.forEach(user_sites, function (site) {
      promises.push(SiteService.loadSite(site.$value));
    });

    $q.all(promises).then(function(loaded_sites) {
      angular.forEach(loaded_sites, funciton(loaded_site) {
        loaded_site.transactions = [];
        loaded_site.subscriptions = [];

        angular.forEach(user_subscriptions, function (subscription) {
          console.log('SUBSCRIPTION: ', subscription);
          if ( subscription.uuid === loaded_site.recurly_subscription_uuid ) {
            loaded_site.subscriptions.push(subscription);
          }
        });
        angular.forEach(transactions, function (transaction) {
          if ( transaction.subscription ) {
            if ( getSubscriptionId(transaction.subscription.$.href) === loaded_site.recurly_subscription_uuid ) {
              loaded_site.transactions.push(transaction);
            }
          }
        });
        $scope.sites.push(loaded_site);
      });
     });
  });