Javascript AngularJS-正确格式化异步调用

Javascript AngularJS-正确格式化异步调用,javascript,angularjs,node.js,asynchronous,Javascript,Angularjs,Node.js,Asynchronous,我是新手 我试图了解我需要如何在控制器中构造异步调用,以适合我的特定用例: 考虑我的项目中“service.js”中Angular模块的以下代码片段: function getSearchObjects(projectName, title) { var payload = JSON.stringify({ "title": title }); var request = $http({ method: 'post', u

我是新手

我试图了解我需要如何在控制器中构造异步调用,以适合我的特定用例:

考虑我的项目中“service.js”中Angular模块的以下代码片段:

function getSearchObjects(projectName, title) {
    var payload = JSON.stringify({
        "title": title
    });

    var request = $http({
        method: 'post',
        url: URL + '/search/' + projectName,
        data: payload
    });
    return request.then(handleSuccess, handleError);
};

function runQuery(projectName, fromDate, toDate, sort, direction, columns) {
    var from = Date.parse(fromDate);
    var to = Date.parse(toDate);

    var payload = JSON.stringify({
                                    "fromDate": from,
                                    "toDate": to,
                                    "sort": sort,
                                    "direction": direction,
                                    "columns": columns
                                });
    console.log(payload);
    var request = $http({
        method: 'post',
        url: URL + '/query/' + projectName,
        data: payload
    });
    return request.then(handleSuccess, handleError);
}

function handleSuccess(response) {
    return response.data;
};

function handleError(response) {
    if (!angular.isObject( response.data ) || !response.data.error) {
        return( $q.reject( "An unknown error occurred." ) );
    }
    return $q.reject( response.data.error );
};

});
在我的控制器中,我正在尝试对以下功能进行故障排除:

$scope.submit = function() {
  var objectProperties = exportsStorageService.getSearchObjects($scope.selected.project.name, $scope.selected.search)
    .then(function(result) {
        exportsStorageService.runQuery($scope.selected.project.name, $scope.selected.start_date, $scope.selected.end_date, objectProperties.sort, objectProperties.direction, objectProperties.columns)
    },            
    function(error) {
        console.log(error);
    });
};
function handleSuccess(response) {
    return response.data;
};
getSearchObjects匹配在我的UI中选择的标题($scope.selected.search),并从API调用中获取以下更详细的对象:

{ title: 'Duplication Example',
sort: '#_traac-timestamp',
direction: 'desc',
columns: [ '#_traac-remote_ip', 'c-platform-m-distinct-id_s', '_type' ] }
我试图获取从getSearchObjects返回的属性,并将它们与一些用户选择的值一起从我的UI传递到runQuery,然后runQuery将数据从数据库返回给用户,但是当我在控制器中使用上述逻辑检查传递到runQuery的值时,我得到以下值。我试图传递给runQuery的所有objectProperties值都未定义:

project_name: "Example Project"
start_date: 1499770800000
end_date: 1499943600000
sort: undefined
direction: undefined
columns: undefined
我一直在尝试调试它,但我太新了,无法使用角度调用和异步调用来真正理解我做错了什么。我目前最好的猜测是,我在将从getSearchObjects检索到的值附加到objectProperties之前调用runQuery。要么就是我错误地引用了objectProperties变量中的属性

有人能帮我解决这个问题,更好地理解我做错了什么吗

提前感谢您的帮助

执行此操作时:

var objectProperties = some async function...
您将异步函数的承诺分配给变量,而不是它的结果

结果出现在
中。然后,
,就像您声明的那样:

.then(function(result) { ... }
因此,请尝试使用
result.sort、result.direction、result.columns
,而不是
objectProperties.sort、objectProperties.direction、objectProperties.columns
:)

如果你是新的承诺,看看这个


编辑

根据您的评论,您将在response.data中收到以下对象:

{"objectMatch": {
    "title": "doc-event",
    "sort": "#_traac-timestam‌​p",
    "direction": "desc‌​",
    "columns": [
                 "m-doc-‌​name_s",
                 "m-user_s",
                 "‌​m-full-action-type_s‌​",
                 "m-event-action-de‌​scriptor_s"
               ]}
}
因此,您有:响应>数据>对象匹配>所需的属性

handleSuccess
函数中提取的response.data:

$scope.submit = function() {
  var objectProperties = exportsStorageService.getSearchObjects($scope.selected.project.name, $scope.selected.search)
    .then(function(result) {
        exportsStorageService.runQuery($scope.selected.project.name, $scope.selected.start_date, $scope.selected.end_date, objectProperties.sort, objectProperties.direction, objectProperties.columns)
    },            
    function(error) {
        console.log(error);
    });
};
function handleSuccess(response) {
    return response.data;
};
在这里,您的
结果是
response.data
,包含属性
objectMatch

$scope.submit = function() {
  var objectProperties = exportsStorageService.getSearchObjects($scope.selected.project.name, $scope.selected.search)
    .then(function(result) {
        ...
    },
    ...
如果所有这些都正确,您应该能够使用
result.objectMatch.
访问所需的值,如:

exportsStorageService.runQuery($scope.selected.project.name, $scope.selected.start_date, $scope.selected.end_date,
    result.objectMatch.sort, result.objectMatch.direction, result.objectMatch.columns)

谢谢你的洞察力。我尝试了你提出的解决方案,但三个结果属性仍然没有定义:(还有其他想法吗?我整个下午都在绞尽脑汁…@Joey Marinello你对
getSearchObjects
returning有什么要求?看看“网络”如果您不确定如何调试,请单击Chrome开发者工具上的选项卡。
{“objectMatch”:{“title”:“doc event”,“sort”:“#traac-timestamp”,“direction”:“desc”,“columns”:[“m-doc-name”,“m-user”,“m-full-action-type”,“m-event-action-descriptor”]}
这是我得到的响应。@Joello根据您的评论编辑了我的答案。