在angularjs中构建承诺

时间:2014-07-29 14:30:57

标签: javascript angularjs

我已经做了很多关于这方面的阅读,但最终我发现的教程和指南对我来说有太大的不同,可以很好地掌握这个概念。

这就是我想要实现的目标:

  

1)来自我们服务器的简单http请求[任何用于演示的API]

     

2)使用(1)中的数据运行一个函数。 [从对象中删除属性]

     

3)使用(2)的结果和长度来运行$ http请求循环到我们的服务器。 [或任何服务器]

     

4)这将产生6个不同的对象。在这6个对象上运行一个函数。 [添加房产]

     

5)完成所有这一切后,运行一个单独的功能[Log“finished”]

如何使用承诺实现这一目标?如何将数据从(1)通过承诺传递给(2)?这是实现我需要做的正确方法吗?

如果有人能告诉我这是如何构建的,那将是非常有帮助的;我为这个问题保持了尽可能简单的功能。

3 个答案:

答案 0 :(得分:2)

是的,承诺非常适合为这类问题构建解决方案。

简化解决方案(或多或少的伪代码):

$http(...)
    .then(function(response) {
        // do something with response, for example:
        var list = reponse.data.list;
        // return it so that you can use it in the next 'then'.
        return list;
    })
    .then(function(list) {
        var promises = [];
        angular.forEach(list, function(item) {
            // perform a request for each item
            var promise = $http(...).then(function(itemResponse) {
                itemResponse.extraProperty = true;
                return itemResponse;
            });
            // we make an array of promises
            promises.push(promise);
        });
        // combine all promises into one and return it for the next then()
        return $q.all(promises);
    })
    .then(function(itemsList) {
        // itemsList is now an array of all parsed item responses.
        console.log(itemsList);
    });

(希望这是对的,我没有测试过。)

如您所见,您可以在回调中返回值以将其传递给下一个then(),或者您可以传递一个promise,这将导致在它解析时调用下一个回调。 $q.all()用于将多个promises组合成一个,并解决所有问题的解决方法。

编辑:我意识到你可以选择省略这三行:

        return list;
    })
    .then(function(list) {

但它的语法很好,因为任务的分离更加明显。

答案 1 :(得分:1)

不知道为什么你难以实现这一点,但也许$q.all()是你错过的:

var config1={method:'GET',url:'/api/...'};

$http(config1).success(function(resultsFrom1){
  functionForResultsOf1(resultsFrom1);
})


var functionForResultsOf1 = function(resultsOf1){
//remove something from the result, assuming this is a synchronous operation
resultsOf1.splice()...;
var promises=makePromises(*pass whatever you want*);
 $q.all(promises).then(function(aggregateOfAllCallsToServer){
    angular.forEach(aggregateOfAllCallsToServer,function(data){
     //do something to data from each call to the server

    })

    console.log("finished");

 })
}

 var makePromises = function(serverUrls){

          var promises = [];
          angular.forEach(serverUrls, function(url) {

          var promise=$http({
                url   : '/api/'+url,
                method: 'GET',
          })

          promises.push(promise);
    });

    return $q.all(promises);
 }

答案 2 :(得分:1)

检查下面的代码,它可能包含语法错误,重要的是结构。 Step3包含多个(6)$ http请求,它等待最后一个请求响应,返回一个包含每个$ http requets响应的唯一响应对象(数组)。

//Step 1
var Step1 = function () {
    $http.get('api/controller').success(function (resp) {
        var object1 = resp;
        Step2(object1);
        Step3(object1).then(function (resp) {
            //resp.data is an array containing the response of each $http request
            Step4(resp);
            Step5();
        });
    });
}

//Step2
var Step2 = function(obj){
    //do whatever with the object
}
//Step3
var Step3 = function (object1) {
            var call = $q.defer();
            var get1 = $http.get(object1[0].url);
            var get2 = $http.get(object[1].url2);
            //...
            var get6 = $http.get(object[5].url6);

            $q.all([get1, get2,..get6]).then(function (resp) {
                call.resolve(resp);
            });
            return call.promise;
        }
//Step4
var Step4 = function (resp) {
    for (var i=0; i<resp.data.lenght;i++){
        DoWhatEver(resp.data[i]);
    };
}
//Step5
var Step5 = function () {
    alert("Finished");

}

Step1(); //Call Step1 function