2017-07-17 10 views
0

初心者ここに。私のプロジェクト内の「service.js」の角のモジュールから次のコードスニペットを考えてみましょうAngularJS - 非同期呼び出しを正しくフォーマットする

::私は私の特定のユースケースに合わせて私のコントローラ内で非同期呼び出しを構築する必要があるかを理解しようとしています

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から返さつかむと、いくつかのユーザーと一緒にそれらを渡すためにしようとしています私のUIをrunQueryに、データベースからユーザーに返しますが、上記のロジックを使用してrunQueryに渡された値をコントローラで確認すると、次の値が得られます。私はこれをデバッグしようとしている

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

が、私は本当に私が間違っているのかを理解するために角度と非同期呼び出しを使用することにあまりにも新しいです:私はによってRunQueryに渡すしようとしていますobjectPropertiesの値のすべてが定義されていません。現在、私の推測では、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


EDIT

あなたのコメントをもとに、あなたは、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; 
}; 

だからここに、あなたのresultは、プロパティobjectMatchを含む、response.dataです。

$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

は、洞察力をいただき、ありがとうございます。私はあなたの提案された解決策を試しましたが、3つの結果のプロパティはまだ未定義に戻ってきています:(他のアイデア?私はこのすべての午後に困惑しています... –

+0

@JoeyMarinello 'getSearchObjects'から返ってきたリクエストは? Chromeデベロッパーツールの「ネットワーク」タブで、あなたがそれをデバッグする方法がわからない場合 – tiagodws

+0

'{「objectMatch」:{「タイトル」:「DOC-イベント」、「ソート」:「#_ traac-タイムスタンプ」、」 「m-doc-name_s」、「m-user_s」、「m-full-action-type_s」、「m-event-action-descriptor_s」]}} ' 私が得る応答です 。 –

関連する問題