Javascript 同一方法中的多个post请求
因此,我试图呈现一个图形,它使用来自两个不同且独立的post请求的数据。但是,在第二个post请求的数据到达之前调用graph命令。我怎样才能解决这个问题?发出post请求和呈现图形的命令在post代码中作为注释提到Javascript 同一方法中的多个post请求,javascript,angularjs,asynchronous,synchronous,Javascript,Angularjs,Asynchronous,Synchronous,因此,我试图呈现一个图形,它使用来自两个不同且独立的post请求的数据。但是,在第二个post请求的数据到达之前调用graph命令。我怎样才能解决这个问题?发出post请求和呈现图形的命令在post代码中作为注释提到 $scope.observer_vel_data = function(){ $scope.showOverlay('loadRefPubVel'); $http({ //First http post r
$scope.observer_vel_data = function(){
$scope.showOverlay('loadRefPubVel');
$http({
//First http post request
method:'POST',
url:'/api/observer_vel_data',
data:$scope.payload_array,
}).then(function successCallback(response){
console.log('API Endpoint: vel data success!');
//Second post request is made in the method call below
$scope.sentiment_var = $scope.observer_send_sentiment();
$scope.vel_var = response.data.velocity1;
}, function errorCallback(response){
// console.log(response);
$scope.addAlert({
type: 'danger',
msg: 'API call failed'
});
}).finally(function(){
console.log("hello");
console.log($scope.sentiment_var);
//graph is rendered
$scope.update_velocity($scope.vel_var,$scope.sentiment_var);
$scope.hideOverlay('loadRefPubVel');
});
};
如果我理解正确,您希望代码最终。。。仅在第二个请求结束后执行 要实现这一点,您需要链接HTTP请求承诺,这意味着您需要从第一个请求的成功处理程序返回第二个HTTP请求的承诺。您的代码应该大致如下所示:
$scope.observer_send_sentiment = function (){
// $scope.showOverlay('loadRefSentiment');
var data = {
"angularGroups":$scope.groups
};
// console.log(data);
$http({
method:'POST',
url:'http://localhost:9612/sentiment_velocity',
data:data
}).then(function successCallback(response){
var data = response.data;
var json_obj = JSON.parse(data.replace(/\'/g,'"'));
var sentiments = json_obj["sentiments"];
// console.log(sentiments);
$scope.update_sentiment(sentiments);
console.log(sentiments);
return sentiments;
}, function errorCallback(response){
var errmsg = response.statusText;
console.log(response);
$scope.addAlert({
type: 'danger',
msg: 'API call failed (sentiment basic)' + errmsg,
});
}).finally(function(){
// $scope.hideOverlay('loadRefSentiment');
});
};
请注意,无论是否发生错误,最终回调都将始终执行。如果希望仅在未遇到错误时执行其中一些函数,请添加另一个.thenfunction{…}
编辑:现在我们可以看到observer_send_情绪的作用了,您可以继续使用.thenfunction successCallback{…},function errorCallback{…}语法,并为每个请求保留单独的错误回调。请记住,如果您添加了另一个then块,并且希望沿着承诺链出现错误,以防止进一步执行。然后,在函数{…}块中,您应该在两个errorCallbacks的末尾添加return$q.rejectresponse。如果不使用带有.thenfunction successCallback{…},function errorCallback{…}语法的q.reject from error callbacks,则表示承诺已解析,而不是被拒绝 这是第二次调用:$scope.touction\u var=$scope.observer\u send\u touction;?如果是实际的http请求代码,请包括。@alphapilgrim Addddo这两个请求都在同一个控制器/工厂中吗?@alphapilgrim是的,它们在同一个控制器中。
$scope.observer_vel_data = function(){
$scope.showOverlay('loadRefPubVel');
$http({
method:'POST',
url:'/api/observer_vel_data',
data:$scope.payload_array,
}).then(function successCallback(response){
console.log('API Endpoint: vel data success!');
$scope.vel_var = response.data.velocity1;
return $scope.observer_send_sentiment();
}).catch(function errorCallback(response) {
//This catch will handle errors from both HTTP requests
$scope.addAlert({
type: 'danger',
msg: 'API call failed'
});
})
.finally(function(){
console.log("hello");
console.log($scope.sentiment_var);
//graph is rendered
$scope.update_velocity($scope.vel_var,$scope.sentiment_var);
$scope.hideOverlay('loadRefPubVel');
});
};
$scope.observer_send_sentiment = function() {
return $http({...}).then(function(response) {
//process the response
...
$scope.sentiment_var = parsedResponseData;
});
};