Question : Pourquoi n'est-il pas exécuté location.href = "../exit.html";
, 而是执行了 window.location.href = 'http://www.baidu.com';
?
Existe-t-il un moyen d'exécuter la méthode getData()
, 如果获取数据失败,则跳转到 ../exit.html
, 不再执行 gourl();
?
Supplément : ajax里面的 async: false 是同步请求!!!
, ce n'est qu'une simple démo. En fait, il peut y avoir beaucoup de logique derrière la méthode getData(), mais si getData() ne parvient pas à obtenir des données, le programme ne sera pas autorisé à exécuter d'autres méthodes, et d'autres méthodes peuvent ne pas être présentes dans le même fichier.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
</head>
<body>
<p>
<h2>我是测试页面,看我是否发生跳转</h2></p>
<script src="https://cdn.bootcss.com/jquery/1.9.0/jquery.min.js"></script>
<script type="text/javascript">
$(function() {
getData();
gourl();
});
function getData() {
var is_success = false;
$.ajax({
type: "GET",
url: "http://baike.baidu.com/api/openapi/BaikeLemmaCardApi?scope=103&format=json&appid=379020&bk_key=bug&bk_length=600",
data: "",
dataType: "json",
async: false,
success: function(data) {
if (data.status == 200) {
is_success = true;
} else {
is_success = false;
}
}
});
if (!is_success) {
location.href = "../exit.html";
}
}
function gourl() {
console.log('我被执行了');
window.location.href = 'http://www.baidu.com';
}
</script>
</body>
</html>
Ensuite, vous pouvez rappeler gourl après le succès de la méthode getData pour effectuer le traitement logique souhaité
De plus, je ne sais pas comment juger spécifiquement votre is_success car il y a $ajax et une erreur correspondante
Votre code équivaut à exécuter les deux phrases suivantes :
Lorsque ces deux phrases sont exécutées en continu, elles passeront à l'adresse suivante
Je suppose qu'il faut du temps au navigateur pour accéder au premier, mais avant qu'il ne réussisse, le deuxième saut revient, donc j'abandonne le premier saut et j'exécute le deuxième saut, comme si j'entrais rapidement l'adresse deux fois dans le URL Idem.
La fonction
gourl() ne peut pas être appelée devant, mais doit être placée au milieu de la logique Ajax, et ajouter
else{gourl();}
après la logique if :
Le code du questionneur peut être compris comme suit :
Lorsqu'il y a deux location.hrefs consécutifs dans le code, le saut suivant sera exécuté. Le sujet de cette question peut l'essayer lui-même.
De plus, comme ajax est asynchrone, le sujet doit également écrire
if(!is_success)
写到ajax中的error中去,或者写到success中的else判断中,否则无论ajax是否成功,都会跳转。gourl()
dans le succès.De plus, des erreurs inter-domaines devraient se produire si ajax est utilisé directement comme ceci. Il est recommandé d'utiliser un proxy ou d'autres méthodes pour résoudre les problèmes inter-domaines.
Code de téléphone portable, c'est ce que tu veux dire ?
Utilisant principalement les promesses de jQ, toutes écrites de manière asynchrone, tous les rappels réussis d'ajax sont placés dans le done de Deferred (s'il y en a plusieurs, ils peuvent également être écrits sous forme de tableaux), puis donnent simplement un statut directement dans le done d'ajax.
Puisque
getData
和gourl
有执行的关系,要么把gourl
est placé en jugement de rappel, cela peut convenir à une utilisation asynchrone.Si c'est une synchronisation avec le sujet, alors ça va
Puis-je contrôler Gourl directement ici pour l'exécuter ?
Il se peut qu'il y ait un problème avec la logique de votre code. Ajax est asynchrone. gourl(); Cette fonction ne doit pas être appelée à cet endroit. Il peut être appelé lors du rappel de réussite ou d’échec de la requête ajax.
Au vu de votre demande, elle devrait être appelée avec succès.