angularjs return $q.all 的另一个承诺

angularjs return another promise in $q.all

在我的 angularjs/ionic 应用程序中,我从 sqlite 数据库获取数据,并希望从依赖于数据库变量值的 Web 服务获取数据。我认为这可能是可能的:

.factory('WebSrvs', function($http,DatabaseSrvs) {

var getData = function() {

var promiseReceiverUrl = DatabaseSrvs.getLocalValue('value1');
var promiseVehicleId = DatabaseSrvs.getLocalValue('value2');

$q.all([promiseReceiverUrl,promiseVehicleId]).then(function(results) {

  if(results[0].rows.length > 0 && results[1].rows.length > 0) {

    var v1 = results[0].rows.item(0).Value;
    var v2 = results[1].rows.item(0).Value;

    var req = {
      method: 'POST',
      url: v1,
      headers: {
        'Content-Type': 'application/json; charset=utf-8'
      },
      data: {
        value: v2
      },
      timeout: 10000,
      crossDomain: true
    };

    return $http(req);
  }
});
}
}

但是,如果这样做并使用 var promise1 = WebSrvs.getData(); 调用它,我不会得到任何回复,并且该应用程序在一个永无止境的重新加载队列中运行。我做错了什么?

在您的工厂实现中,您首先需要 return getData 函数。同样在 getData 函数中,您必须 return $q.all.

.factory('WebSrvs', function($http,DatabaseSrvs) {

  var getData = function() {

   var promiseReceiverUrl = DatabaseSrvs.getLocalValue('value1');
   var promiseVehicleId = DatabaseSrvs.getLocalValue('value2');

    return $q.all([promiseReceiverUrl,promiseVehicleId]).then(function(results) {
     ...
     ...
    });
  }
  return {
   getData: getData
  }
}

添加到我的评论中:

.factory('WebSrvs', function($http,DatabaseSrvs) {

    var getData = function() {

        var promiseReceiverUrl = DatabaseSrvs.getLocalValue('value1');
        var promiseVehicleId = DatabaseSrvs.getLocalValue('value2');

        return $q.all([promiseReceiverUrl,promiseVehicleId]).then(function(results) {

          if(results[0].rows.length > 0 && results[1].rows.length > 0) {

            var v1 = results[0].rows.item(0).Value;
            var v2 = results[1].rows.item(0).Value;

            var req = {
              method: 'POST',
              url: v1,
              headers: {
                'Content-Type': 'application/json; charset=utf-8'
              },
              data: {
                value: v2
              },
              timeout: 10000,
              crossDomain: true
            };

            return $http(req);
          }
        });
    }

    return {
        getData: getData
    };
}