Angular - 多重承诺和迭代 - 如何获得结果

时间:2014-09-09 15:28:25

标签: javascript angularjs asynchronous angular-promise

好的,我是JavaScript编程的新手,我真的很挣扎于异步的东西。我试图在下面展示我的例子:

控制器

$scope.handleClick = function(stuff) {
    var promise = fetchOtherStuffs(stuff.id1);
    var promiseTwo = fetchOtherStuffs(stuff.id2);

    $q.all([promise, promiseTwo]).then(function(data) {
        // fails because data is undefined
        console.log(data[0].length);
        console.log(data[1].length);
    }); 
 };

var fetchOtherStuffs = function(stuffId) {
    return $http.get('http://localhost/myapi/stuff/' + stuffId)
        .then(function(theStuffs) {
            var promises = [];

            for (var i = 0; i < theStuffs.data.length; i++) {
                var otherStuffId = theStuffs.data[i].otherStuffId;
                promises.push( 
                $http.get('http://localhost:8085/myapi/otherstuff/' 
                     + otherStuffId));
            }

            $q.all(promises).then(function(data){
                var result = [];

                for (var i = 0; i < promises.length; i++) {
                    result.push(data[i].data[i]);
                }

                // this works and the data count is as expected
                console.log('returning: ' + result.length);            
                return result;
        });               
  });           
};

所以我需要:

  • 致电myapi/stuff
  • 获取该调用的结果(可以是多个对象)并为每个对象调用/myapi/otherstuff
  • 将所有这些对象从 otherstuff 返回到 handleClick 方法

我真的不知道如何实现 fetchOtherStuffs 方法,因此,当 handleClick 需要时,返回实际返回一个值方法

非常感谢。

1 个答案:

答案 0 :(得分:2)

获取return后,您在then回调中忘记了一小部分myapi/stuff

function fetchOtherStuffs(stuffId) {
    return $http.get('http://localhost/myapi/stuff/' + stuffId)
    .then(function(theStuffs) {
         …
         return $q.all(promises).then(function(data){
//       ^^^^^^
             …
             return result;
         });
    });
}

另外,我不确定是否在

中两次访问[i]属性
for (var i = 0; i < promises.length; i++) {
    result.push(data[i].data[i]);
}

是正确的,但这当然取决于数据的格式。