我想使用第一个api的结果,进入第二个api调用。场景是这样的,我想使用第一个api的结果,进入第二个api调用。如果我是正确的,那么我想要同步api调用(不确定)。我试着编写以下功能但不起作用。 function2是在function1之前调用的。 在function2中我们使用的是仅在function2在function2之前调用时才会出现的result1,我该怎么做。
$scope.function1 = function(){
var deferred= $q.defer();
$http.post(api1, data1)
.success(function(response, status) {
if (response.error == 0) {
console.log(response.result);
$scope.result1=response.result;
}
}) ;
deferred.resolve('Success') ;
return deferred.promise;
};
var promise = $scope.addDefaultValue();
promise.then(function(){
$scope.function2();
});
$scope.function2=function(){
var deferred = $q.defer();
$http.post(api2,result1)
.success(function(response, status){
if(response.error == 0){
}
});
deferred.resolve('Success') ;
return deferred.promise;
}
答案 0 :(得分:1)
您无法将$http
请求转换为“同步”。这不是“延期”的意思。延迟是一种将非承诺功能转换为具有承诺能力的功能的方法。 $http
函数返回promise对象,因此您不需要使用deferred。
$http.post(api, data1).then(function (response) {
$scope.result1 = response.data.result;
// return is important here
// so that you can keep chaining with .then
return $http.post(api2, response.data.result);
}).then(function (response) {
// here you have response from api2
$scope.result2 = response.data.result;
console.log(response.data);
}).catch(function (error) {
// here you can handle errors
// from either api calls
// second api call won't be made if the first one fails
console.log(error);
});
答案 1 :(得分:1)
您可以在此处遵循承诺链模式,在承诺对象上使用.then
进行链接。
无需使用$q
创建额外的开销承诺,因为$http
方法在启动ajax时返回promise对象。
<强>代码强>
$scope.function1 = function() {
return $http.post(api1, data1)
.then(function(d) {
var response = d.data;
if (response.error == 0) {
console.log(response.result);
$scope.result1 = response.result;
}
return response;
});
};
$scope.function1().then(function(data) {
$scope.function2();
}, function(error) {
});