2017-07-17 64 views
0

新手在这里。AngularJS - 正确格式化异步调用

我想明白,我怎么需要我的控制器内的结构异步调用,以适应我的具体使用情况:

考虑从一个角模块下面的代码片段在我的项目中“service.js”:

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); 
    }); 
}; 

getSearchObjects标题匹配($ SC ope.selected.search)在我的UI中选择和API调用抓住以下更详细的对象:

{ title: 'Duplication Example', 
sort: '#_traac-timestamp', 
direction: 'desc', 
columns: [ '#_traac-remote_ip', 'c-platform-m-distinct-id_s', '_type' ] } 

我试图抓住性质从getSearchObjects回来,有一些用户沿着他们通过从选择的值我的用户界面runQuery,然后从数据库返回数据给用户,但当我检查传递给runQuery使用我的控制器上述逻辑的值,我得到以下值。所有objectProperties值我试图传递给runQuery的是不确定的:

project_name: "Example Project" 
start_date: 1499770800000 
end_date: 1499943600000 
sort: undefined 
direction: undefined 
columns: undefined 

我一直在试图调试这一点,但我太新,采用了棱角分明和异步调用真正了解我在做什么错。目前我最好的猜测是,我在从getSearchObjects检索到的值附加到objectProperties之前调用runQuery。无论是我还是我错误地引用了objectProperties变量中的属性。

有人可以帮我解决这个问题,并且更好地理解我做错了什么吗?

非常感谢您的帮助!

回答

1

当你这样做:

var objectProperties = some async function... 

要指定承诺异步功能的变量,不是它结果。

结果在.then来,像你这样的宣告:所以

.then(function(result) { ... } 

,而不是objectProperties.sort, objectProperties.direction, objectProperties.columns,请尝试使用result.sort, result.direction, result.columns :)

如果你是新的承诺,看看这个simple, but great tutorial


编辑

基于您的评论,您收到的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" 
       ]} 
} 

所以,你必须:响应>数据> objectMatch >你想要的物业

你提取你的handleSuccess功能response.data:

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

所以在这里,你resultresponse.data,包含属性objectMatch

$scope.submit = function() { 
    var objectProperties = exportsStorageService.getSearchObjects($scope.selected.project.name, $scope.selected.search) 
    .then(function(result) { 
     ... 
    }, 
    ... 

如果这一切是正确的,你应该能够访问你想使用result.objectMatch.<sort, direction or columns>的值,比如:

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

谢谢你的见解。我尝试了你提出的解决方案,但是三个结果属性仍然回来undefined :(其他想法?我一直在这一整个下午难住... –

+0

@JoeyMarinello你从getSearchObjects返回的请求是什么?如果您不确定如何调试,请在Chrome开发者工具的“网络”标签中输入。 – tiagodws

+0

'{“objectMatch”:{“title”:“doc-event”,“sort”:“#_ traac-timestamp”方向“:”desc“,”列“:[”m-doc-name_s“,”m-user_s“,”m-full-action-type_s“,”m-event-action-descriptor_s“]}}' 这就是我得到的回应。 –