Question 1 : Je dois utiliser les données renvoyées par la première requête ajax comme paramètre du deuxième ajax, et le deuxième ajax est envoyé dans la fonction de rappel du premier ajax. Mais il y a un problème ! C'est juste que les données renvoyées par ajax pour la deuxième fois ne peuvent pas être attribuées aux propriétés de l'objet global. Je ne sais pas si je suis tombé dans un gouffre. Je veux donc utiliser $q pour le résoudre.
Question 2 : Prenons cet exemple,
// $q est un service intégré, vous pouvez donc l'utiliser directement
ngApp.factory('UserInfo', ['$http', '$ q', fonction ($http, $q) {
return {
query : function() {
var deferred = $q.defer(); // 声明延后执行,表示要去监控后面的执行
$http({method: 'GET', url: 'scripts/mine.json'}).
success(function(data, status, headers, config) {
deferred.resolve(data); // 声明执行成功,即http请求数据成功,可以返回数据了
}).
error(function(data, status, headers, config) {
deferred.reject(data); // 声明执行失败,即服务器返回错误
});
return deferred.promise; // 返回承诺,这里并不是最终数据,而是访问最终数据的API
} // end query
};
}]);
deferred.resolve consiste à retarder l'exécution ? Donc, si vous pouvez écrire de la logique dans la fonction de rappel, pourquoi s'embêter à retarder l'exécution ?
Question 3 : Pourquoi dit-on que la promesse renvoyée par deferred.promise est l'API de données finale ? Quelle est la fonction de cette promesse ?
Question 4 : Quelle est la logique d'exécution de promise.then ?
Avant de répondre à toutes vos questions, laissez-moi vous expliquer brièvement votre exemple de code ! !
Votre exemple de code est un matériel pédagogique négatif typique de
Promise
Sa caractéristique est : créerdeferred
des objets sans but, ce qui ne fait qu'augmenter la complexité du code. À ce propos, vous pouvez voir l'anti-modèle ici :Tout d'abord, lorsque vous réalisez que vous êtes endurant
callback hell
, félicitations, vous êtes sur le chemin dejavascript
. Alors quelles sont les solutions ? Ceux que nous voyons le plus récemment incluent :Promise
generator
Coopérer avec coasync/await
Concernant l'introduction détaillée de ces méthodes, je n'ai pas lu attentivement les réponses des autres (il y en a peut-être de meilleures), je ne peux donc publier que ce que j'ai écrit auparavant Asynchrone en JavaScript
.OK, nous avons présenté plusieurs façons courantes de résoudre
callback hell
, et parlons de votrePromise
problèmeQuestion 1 : Je dois utiliser les données renvoyées par la première requête ajax comme paramètre du deuxième ajax, et le deuxième ajax est envoyé dans la fonction de rappel du premier ajax. Mais il y a un problème ! C'est juste que les données renvoyées par ajax pour la deuxième fois ne peuvent pas être attribuées aux propriétés de l'objet global. Je ne sais pas si je suis tombé dans un gouffre. Je veux donc utiliser $q pour le résoudre.
Puisque nous espérons que
Promise
pourra résoudre le problème de l'enfer des rappels, nous n'utiliserons certainement plus les rappels. Vos doutes sont corrects, mais votre problème est que vous ne comprenez pas complètement commentPromise
fonctionne. Laissez-moi d'abord vous donner un exemple :Question 2 : Prenons cet exemple
C'est la première question. Vous avez réagi de manière excessive et avez évidemment compliqué un problème simple. Cela suffit :
Là oùest appelé, utilisez simplement
then
directement :Les troisième et quatrième questions sont toutes dues au manque de compréhension de l'implémentation de
étape par étape.Promise
lui-même. J'ai déjà écrit un petit tutoriel pour vous apprendre à écrire une implémentation simple dePromise
à la main. suivez-le. Tout d'abord, ayez une compréhension générale dePromise
lui-même et rédigez une promesse