2016-08-18 88 views
1

我试着调用Post方法,然后根据结果,我将多次调用相同的Post方法并返回结果,使用$ q.all。

Post方法是:

getData: function (params, callback) { 
       $http.post('service/myService', params) 
        .success(function (data) { 
         callback(null, data); 
        }).error(function (error) { 
         callback(error); 
        }); 
      } 

我在调用它下面的功能,这个功能是递归的,所以如果它包含nextUrl我做同样的事,直到有用于paging没有对象:

var result = []; 
var promises = []; 
var checkForPaging = function (nextUrl, service, $q) { 
    var deferred = $q.defer(); 
    var criteria = { 
     url: url 
    } 
    var promise = service.getData(criteria, function (error, data) { 
     if (data.statusCode == 200) { 
      for (var i = 0; i < data.body.items.length; i++) { 
       result.push(data.body.items[i]); 
      } 
      if (data.body.paging != null && data.body.paging.next != null) { 
       checkForPaging(data.body.paging.next.url, service, $q); 
      } else{ 
       deferred.resolve(result); 
      } 
     } 
    }); 

    promises.push(promise); 
    $q.all(promises) 
    return deferred.promise; 
} 

然后我从下面调用这个函数,并且想要在所有调用完成后得到result

checkForPaging(data.body.paging.next.url, myService, $q).then(function (data) { 
     console.log(data) 
    }); 

我遇到的问题是,它从不碰上面的回调函数:console.log(data)。但我可以看到它几次调用Post方法。

如果我解决它像下面那么我可以先Post后看到它是打上面的回调:

$q.all(promises).then(function (results) { 
      deferred.resolve(result); 
     }, function (errors) { 
      deferred.reject(errors);    
     }); 

我这样做对吗?我如何获得结果并多次调用Post方法?

让我知道如果它不明确或有任何问题!

+0

添加返回的getData $ HTTP – Kindzoku

+0

@Kindzoku你是什么意思? – Zaki

+0

顺便说一句,你为什么需要$ q.all? – Kindzoku

回答

0

这里是解决方案:https://plnkr.co/edit/HqkFNo?p=preview我重新编写了一下逻辑。 你可以抓住主要想法。

UPDATE加入promiseless解决方案

1)您的服务应该返回只承诺:

this.getData = function(url, params){ 
    return $http.post(url, params); //You're just returning promise 
} 

2)你不需要$ q.all,您可以使用单承诺:

var result = []; 

var deferred; 

var checkForPaging = function (url) { 

    if(!deferred){ 
     deferred = $q.defer(); 
    } 

    //resolvind service promise 
    newService.getData(url).then(
     //if ok - 200 
     function(response){ 
      for (var i = 0; i < data.body.items.length; i++) { 
       result.push(data.body.items[i]); 
      } 

      if (data.body.paging != null && data.body.paging.next != null){ 
      { 
       return checkForPaging(data.body.paging.next.url); 
      } else{ 
       deferred.resolve(result); 
      } 
     }, 
     //handle errors here 
     function(error) { 

     } 
    ); 

    return deferred.promise; 
} 

3)你应该称呼它:

checkForPaging('url').then(function(data){ 
    //here will be resolved promise 
    console.log(data); 
}); 
1

尝试这样的事情适当承诺链接:

var result = []; 

var checkForPaging = function(nextUrl, service) { 
    var criteria = { 
     url: url 
    } 
    return service.getData(criteria, function(error, data) { 
     if (data.statusCode == 200) { 
      for (var i = 0; i < data.body.items.length; i++) { 
       result.push(data.body.items[i]); 
      } 
      if (data.body.paging != null && data.body.paging.next != null) { 
       return checkForPaging(data.body.paging.next.url, service); 
      } else { 
       return result; 
      } 
     } 
    }); 
} 

checkForPaging(data.body.paging.next.url, myService).then(function(data) { 
    console.log(data) 
}); 

而且的getData:

getData: function(params) { 
    return $http.post('service/myService', params) 
     .then(function(response) { 
      return response.data; 
     }); 
} 
+0

感谢您的回复,我测试了它,现在只碰到一次函数,并没有进入这个函数:返回service.getData(条件,函数(错误,数据){ – Zaki

+0

getData也改变,不应该有任何回调,而应该返回承诺。 – dfsq

+0

我改变了getData,就像你在回答中所说的那样.... – Zaki