2017-07-17 68 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「]}}' 這就是我得到的迴應。 –