Javascript 如何在Angular JS中返回$http.post的成功结果
我有一个Javascript 如何在Angular JS中返回$http.post的成功结果,javascript,angularjs,Javascript,Angularjs,我有一个$http.post呼叫,如下所示: $scope.calcBarCost = function(bar, SAC, fieldSpeed) { console.log('bar cost details', bar); console.log('SAC', SAC); console.log('FIELD SPEED', fieldSpeed); data = { SAC: SAC, access_token: $scope.userData.acces
$http.post
呼叫,如下所示:
$scope.calcBarCost = function(bar, SAC, fieldSpeed) {
console.log('bar cost details', bar);
console.log('SAC', SAC);
console.log('FIELD SPEED', fieldSpeed);
data = {
SAC: SAC,
access_token: $scope.userData.access_token,
fieldSpeed: fieldSpeed
};
var barCost = 0;
return $http.post(apiPath + 'grabFieldLabor.php', data)
.success(function(response) {
var fieldLabor = 1000;
if(response.fieldLabor) {
console.log('Grab Field Labor Response', response);
// After we get the field labor then we can run the calculations
fieldLabor = parseFloat(response.fieldLabor);
console.log('FINAL FIELD LABOR', fieldLabor);
var averageCostPerHour = num($scope.userData.averageIronWorkersCost);
barCost = (bar.weight / (fieldLabor / 8)) * averageCostPerHour
var gradeCost = num($scope.costFactors[bar.grade]) * bar.weight;
var bendCost = num($scope.costFactors[bar.bend]) * bar.weight;
// Increased Cost Considerations
var cf = numberize($scope.costFactors);
var increasedCostConsiderations = 0;
increasedCostConsiderations += (percent(cf.weather) * barCost) + (percent(cf.difficultWorkspace) * barCost) + (percent(cf.materialLifting) * barCost) + (percent(cf.jobSiteInterferences) * barCost) + (percent(cf.naturalDisasters) * barCost) + (percent(cf.difficultCircumstances) * barCost);
barCost += gradeCost + bendCost + increasedCostConsiderations;
}
console.log('Final Bar Cost', barCost);
return barCost;
});
}
我试图返回一个在检索数据后发生的计算,但数据没有返回。我做错了什么?当您返回$http.post时,实际上返回的是一个承诺,而不是.success或.then函数中的返回值 而不是
return barCost;
。。。在父范围中设置barCost
编辑:
备选案文1(承诺):
选项2(回调):
编辑(展开问题后):
要从视图/控制器运行的函数:calculateBarCost。在发出$http请求后,视图上更新$scope.calcBarCost
$scope.calculateBarCost = function(bar, SAC, fieldSpeed) {
...
$http.post(apiPath + 'grabFieldLabor.php', data)
.success(function(response) {
....
$scope.calcBarCost = barCost;
});
}
当返回$http.post时,实际上返回的是一个承诺,而不是.success或.then函数中的返回值 而不是
return barCost;
。。。在父范围中设置barCost
编辑:
备选案文1(承诺):
选项2(回调):
编辑(展开问题后):
要从视图/控制器运行的函数:calculateBarCost。在发出$http请求后,视图上更新$scope.calcBarCost
$scope.calculateBarCost = function(bar, SAC, fieldSpeed) {
...
$http.post(apiPath + 'grabFieldLabor.php', data)
.success(function(response) {
....
$scope.calcBarCost = barCost;
});
}
.success
方法忽略返回值。另一方面,.then
方法使用返回的值创建新的派生承诺,该承诺解析为返回的值
$scope.calcBarCost = function(bar, SAC, fieldSpeed) {
console.log('bar cost details', bar);
console.log('SAC', SAC);
console.log('FIELD SPEED', fieldSpeed);
data = {
SAC: SAC,
access_token: $scope.userData.access_token,
fieldSpeed: fieldSpeed
};
//var barCost = 0;
return $http.post(apiPath + 'grabFieldLabor.php', data)
//.success(function(response) {
//USE then method
.then(function(response) {
var data = response.data;
var barCost;
var fieldLabor = 1000;
//...
//Use data variable to calculate barCost
//...
console.log('Final Bar Cost', barCost);
return barCost;
});
}
用法:
var barCostPromise = $scope.calcBarCost(bar, SAC, fieldSpeed);
barCostPromise
.then( function(barCost) {
console.log(barCost);
}).catch( function(errorResponse) {
console.log(errorResponse.status);
});
但是如何返回值呢?这需要在一个循环中运行几次 JavaScript是单线程的。函数只能返回立即可用的值或稍后使用服务器返回的值(或根据服务器返回的值计算)来实现的挂起承诺
随后的计算可以通过向promise的
方法提供一个函数来完成。提供给的函数。然后
方法由保留,直到数据可用。成功
方法忽略返回值。另一方面,.then
方法使用返回的值创建新的派生承诺,该承诺解析为返回的值
$scope.calcBarCost = function(bar, SAC, fieldSpeed) {
console.log('bar cost details', bar);
console.log('SAC', SAC);
console.log('FIELD SPEED', fieldSpeed);
data = {
SAC: SAC,
access_token: $scope.userData.access_token,
fieldSpeed: fieldSpeed
};
//var barCost = 0;
return $http.post(apiPath + 'grabFieldLabor.php', data)
//.success(function(response) {
//USE then method
.then(function(response) {
var data = response.data;
var barCost;
var fieldLabor = 1000;
//...
//Use data variable to calculate barCost
//...
console.log('Final Bar Cost', barCost);
return barCost;
});
}
用法:
var barCostPromise = $scope.calcBarCost(bar, SAC, fieldSpeed);
barCostPromise
.then( function(barCost) {
console.log(barCost);
}).catch( function(errorResponse) {
console.log(errorResponse.status);
});
但是如何返回值呢?这需要在一个循环中运行几次 JavaScript是单线程的。函数只能返回立即可用的值或稍后使用服务器返回的值(或根据服务器返回的值计算)来实现的挂起承诺
随后的计算可以通过向promise的
方法提供一个函数来完成。提供给。然后方法的函数由保留,直到数据可用。您应该将承诺函数.success()
放在控制器中。比如:
angular.module('app').controller('myController', ['$scope','myService',function($scope, myService){
$scope.barCost = 0;
function makeHttpPost() {
//Here we call the $http.post function which is hypothetically created in 'myService'
myService().then(success, fail);
function success(resp) {
//Do whatever calculations I have to do and assign the result on $scope.barCost.
}
function fail(resp) {
//Handle Errors
}
}
}])
您应该将promise函数.success()
放在控制器中。比如:
angular.module('app').controller('myController', ['$scope','myService',function($scope, myService){
$scope.barCost = 0;
function makeHttpPost() {
//Here we call the $http.post function which is hypothetically created in 'myService'
myService().then(success, fail);
function success(resp) {
//Do whatever calculations I have to do and assign the result on $scope.barCost.
}
function fail(resp) {
//Handle Errors
}
}
}])
您确定在成功
上收到任何响应
?这个代码在哪里?服务上的函数?你怎么称呼这个代码?为了帮助您,请发布更多的代码来澄清这些。是的,我收到了一个响应请,发布完整的函数代码,以及您从任何地方调用它的方式,以便我们可以在上下文中看到这一点。我更新了它,以显示整个函数。您确定您在成功上得到了任何响应?这个代码在哪里?服务上的函数?你怎么称呼这个代码?为了帮助你,请发布更多的代码来澄清这些。是的,我得到了一个响应请发布完整的功能代码,以及你如何从任何地方调用它,因此,我们可以在contextI中看到这一点。我更新了它以显示整个函数如何将值返回到父函数?该集合是成功后变量的范围变量,但它不会更改返回值。我仍然未定义如何将值返回到父函数?该集合是成功后变量的范围变量成功但它不会改变返回值我仍然没有定义如何返回值?这需要在一个循环中运行几次当您说“这需要在一个循环中运行几次”时,您的意思是计算需要几个XHR POST操作吗?或者你是说别的?$scope.calcBarCost()在一个循环中运行了好几次,每次都需要返回一个值,现在我无法让它返回任何东西,除了未定义编写的代码,返回httpPromise,除非它是AngularJS v1.6,在这种情况下,控制台中应该有运行时错误消息,因为.success
方法已被删除。但是如何返回值?这需要在一个循环中运行几次当您说“这需要在一个循环中运行几次”时,您的意思是计算需要几个XHR POST操作吗?或者你是说别的?$scope.calcBarCost()在一个循环中运行了好几次,每次都需要返回一个值,现在我无法让它返回任何东西,除了未定义编写的代码,返回httpPromise,除非它是AngularJS v1.6,在这种情况下,控制台中应该有运行时错误消息,因为.success
方法已被删除。