我有3个需要串行运行的ajax调用。我的问题是如何使用$ interval执行此操作。还有另一种方法来实现这一目标吗?
我有这些电话。
<Test>
<SubTest> 123.00 </SubTest>
</Test>
但是我想重复它们但是如果我得到一定的值就可以取消它们。在从getDataFromServer3UsingServer2Data获取数据之前,$ interval不会运行getDataFromServer1(),因为它不会等待。什么是实现这一目标的最佳方式?感谢。
答案 0 :(得分:1)
我不确定这是否正确,但您可以尝试这样的事情:
function getDataFromServer() {
getDataFromServer1().then(function(res1) {
if (value === YOU_CERTAIN_VALUE) {
//do what you want
return
}
getDataFromServer2UsingServer1Data(server1).then(function(res2) {
if (value === YOU_CERTAIN_VALUE) {
//do what you want
return
}
getDataFromServer3UsingServer2Data(server2).then(function(res3) {
if (value === YOU_CERTAIN_VALUE) {
//do what you want
return;
}
//calling the function again.
getDataFromServer();
});
});
});
}
答案 1 :(得分:0)
可以使用promise
完成此操作。
您应该从下面的每个服务器调用中返回一个承诺,
function getDataFromServer1(){
return $http.get('your_url', {options});
}
在这里,您将返回$http
的结果。 $http
将返回一个promise,以便您在调用此函数时可以处理此承诺。
现在你可以实现这样的要求,
getDataFromServer1().then(function(response){
if(response.data == someValue){
// if you condition satisfied then call next server call
getDataFromServer2UsingServer1Data().then(function(response){
if(some_condition){
getDataFromServer3UsingServer2Data().then(function(response) {
});
}
});
}
});
答案 2 :(得分:0)
链接承诺是处理错误和优雅的更好方法,当有这种依赖时。
function getDataFromServer1() {
return $http
.get('/some/url/in/server1')
.then(function(response) {
$scope.server1Data = response.data; // If this data is needed in scope
return response.data;
});
}
function getDataFromServer2WithServer1Data(server1Data) {
if(server1Data.condition === 'not met') {
return $q.reject('server1 condition not met');
}
return $http
.get('/some/url/in/server2')
.then(function(response) {
$scope.server2Data = response.data; // If this data is needed in scope
if(server2Data.condition === 'not met') {
throw 'server2 condition not met'; // other way to abort the chain, it reaches the final catch block
}
return response.data;
});
}
function getDataFromServer3WithServer2Data(server2Data) {
return $http
.get('/some/url/in/server3')
.then(function(response) {
$scope.server3Data = response.data; // If this data is needed in scope
return response.data;
});
}
getDataFromServer1()
.then(getDataFromServer2WithServer1Data)
.then(getDataFromServer3WithServer2Data)
.catch(function(rejectReason){
console.log('error occured', rejectReason);
});
此blog解释了有关此方案的更多信息,建议您仔细阅读。