Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 角度-当第二个查询取决于第一个查询的结果时,如何等待两个查询?_Angularjs - Fatal编程技术网

Angularjs 角度-当第二个查询取决于第一个查询的结果时,如何等待两个查询?

Angularjs 角度-当第二个查询取决于第一个查询的结果时,如何等待两个查询?,angularjs,Angularjs,我试图从不同的数据库中获得两个结果集。第二个结果取决于从第一个结果集中检索到的参数。我想确保在继续之前返回两个结果集。看看其他一些问题,我想这可能会奏效: app.factory('myService',['$http','$q',function ($http, $q){ function getDetails(scope){ var paths = []; return $q.all([ $ht

我试图从不同的数据库中获得两个结果集。第二个结果取决于从第一个结果集中检索到的参数。我想确保在继续之前返回两个结果集。看看其他一些问题,我想这可能会奏效:

app.factory('myService',['$http','$q',function ($http, $q){

        function getDetails(scope){
            var paths = [];
            return $q.all([
                $http.post('getdetails.php',{begDate:scope.begDate, endDate:scope.endDate})
                .then(function(response) {
                     angular.forEach(response.data,function(table,key){
                        angular.forEach(table, function(row,key){
                            paths.push(row.CURRENT_PATH);
                        })
                     })
                     return response;
                 })
            ,
                $http.post('coordtest.php', {paths: paths})
                .then(function(response) {
                    return response;
                })
            ]);

        }

        return {
            getDetails: getDetails
        };
}]);

但是当路径仍然为空时返回这两个结果?

在从第一个请求检索数据之前,似乎无法发出第二个请求。但是,您希望返回第二个请求的承诺。这是可能的,但是
$q.all
不太合适(对于所有请求都可以一次发送的场景更有用)

您实际上想要的是让一个请求(B)依赖另一个请求(A)的结果,但要返回B的承诺,以便可以使用其结果。这可以使用
$q.defer
使用以下模式创建包装承诺:

var response = $q.defer();
$http.get('a').success(function(data){
    $http.get('b', data).then(response.resolve, response.reject);
});
return response.promise;
在代码中,这可能类似于:

app.factory('myService',['$http','$q',function ($http, $q){

    function httpGetDetails(scope){
        return $http.post('getdetails.php',{
            begDate:scope.begDate, 
            endDate:scope.endDate
        });
    }    

    function parseDetails(response){
        return response.reduce(function(parsedResults, table){
            var paths = table.map(function(row){
                return row.CURRENT_PATH;
            });
            return parsedResults.concat(paths);
        }, []);
    } 

    function getDetails(scope){
        var result = $q.defer();

        var getDetailsRequest = httpGetDetails(scope);

        getDetailsRequest.success(function(response){
            var paths = parseDetails(response);

            $http.post('coordtest.php', {paths: paths})
                   .success(result.resolve) // Both requests succeeded
                   .error(result.reject);  // coordtest.php failed
        });

        // getdetails.php failed. 
        // Consider sending params that make it more obvious which failed
        getDetailsRequest.error(result.reject);

        return result.promise;
    }

    return {
        getDetails: getDetails
    };
}]);
显然,您可以稍微清理一下函数,但这是链接承诺的简单要点


这样做的目的是创建一个运行时间更长的承诺,并根据内部(第二个)请求的结果手动解决它。这类似于从您的
myService
工厂返回
coordtest
响应,只是它是可行的(您无法同步返回异步函数中做出的
$http
承诺,因此您需要提前完成并创建屏蔽承诺)

$.q.all()
不会让第二个请求等待第一个请求…它们将运行simultaneously@charlietfl谢谢你的回复,你能告诉我怎样才能达到那种行为吗?看看,应该会有帮助的。非常感谢你的帮助。这是有道理的,尽管我可以在从B返回承诺后使用承诺A和B的结果吗?当然,只需将它们包含在B的
resolve
中。类似
.success(函数(dataB){response.resolve({resultsA:data,resultsB:dataB});})。世界就是你的牡蛎,在这个内在的成功函数中,发回你想要的任何数据。(当然,使用比我在实际系统中编写的更具描述性的变量名。可能是
{path:path,coords:coords}
之类的)。