Maison > interface Web > js tutoriel > 6 caractéristiques de la programmation asynchrone JavaScriptPromise mode_javascript skills

6 caractéristiques de la programmation asynchrone JavaScriptPromise mode_javascript skills

WBOY
Libérer: 2016-05-16 16:53:35
original
996 Les gens l'ont consulté

Avant de commencer l'introduction formelle, nous voulons voir à quoi ressemble la promesse Javascript :

Copiez le code Le code est comme suit :

var p = new Promise(function(resolve, rejet) {
solve("hello world");
});

p. then(function(str ) {
alert(str);
});

1 then() renvoie une promesse fourchue.

Quelle est la différence entre les deux morceaux de code suivants ?

Copier le code Le code est le suivant :

// Pièce A
var p = new Promise (/*...*/);
p.then(func1);
p.then(func2);

// Pièce B
var p = new Promise(/ *...*/);
p.then(func1)
.then(func2);

Si vous prenez au sérieux les deux morceaux de code ci-dessus, alors Promises est simplement un unidimensionnel Un tableau de fonctions de rappel. Cependant, ce n’est pas le cas. Chaque appel then() renvoie une promesse forcée. Par conséquent, dans ExhibitA, si func1() lève une exception, func2() est toujours appelée normalement.

Dans ExhibitB, si func1() renvoie une erreur, fun2() ne sera pas appelé car le premier appel renvoie une nouvelle promesse, qui sera rejetée dans func1(). Le résultat est que func2() est ignoré.

Résumé : les promesses peuvent être divisées en plusieurs chemins, semblables à des organigrammes complexes.

2. Le rappel devrait fournir le résultat

Quel avertissement recevrez-vous lorsque vous exécuterez le code suivant ?

Copier le code Le code est le suivant :

var p = new Promise(function(resolve , rejeter) {
solve("hello world");
});

p.then(function(str) {})
.then(function(str) {
alert (str);
});

L'alerte dans la seconde then() n'affiche rien. En effet, la fonction de rappel, dans le contexte de la promesse, n'a pas de fonction de rappel car le résultat change. La promesse s'attend à ce que votre fonction de rappel renvoie le même résultat ou un résultat de remplacement, qui est ensuite transmis à la fonction de rappel suivante.

Utilisez de la même manière adpater pour modifier les résultats, comme suit :

Copiez le code Le code est le suivant :

var footToMetres = function(ft) { return ft*12*0.0254 };

var p = new Promise(/*...*/);

p .then(feetToMetres)
.then(function(meters) {
alert(meters);
});

3. Seules les exceptions de la couche supérieure peuvent être détectées.

Quelle est la différence entre ces deux morceaux de code ?

Copier le code Le code est le suivant :

// Pièce A
nouvelle Promesse (function( solve, rejet) {
solve("hello world");
})
.then(
function(str) {
throw new Error("uh oh") ;
},
non défini
)
.then(
non défini,
function(error) {
alert(error);
}
);

// Pièce B
new Promise(function(resolve, rejet) {
solve("hello world");
})
.then(
function(str) {
throw new Error("uh oh");
},
function(error) {
alert(error);
}
);


dans Dans le premier morceau de code, l'exception levée dans le premier then() sera interceptée par le second then(), puis l'avertissement "uh oh" sera déclenché. Il s'ensuit que seules les exceptions du niveau précédent seront détectées.

Dans le deuxième morceau de code, la fonction de rappel et la fonction de rappel d'erreur sont au même niveau, ce qui signifie que lorsqu'une exception est levée dans le rappel, elle ne sera pas interceptée. En fait, le rappel d'erreur dans le deuxième code ne sera renvoyé que lorsque la promesse est rejetée ou que la promesse elle-même échoue

4. Les erreurs peuvent être récupérées

Dans une fonction de rappel d'erreur, si vous ne renvoiez pas l'erreur, la promesse supposera que vous avez récupéré de l'erreur et que vous revenez à l'état résolu. Dans l'exemple suivant, "je suis enregistré" sera affiché car le rappel d'erreur dans le premier then() n'a pas renvoyé l'exception.

Copier le code Le code est le suivant :

var p = new Promise(function(resolve, rejet) {
reject(new Error("pebkac"));
});

p.then(
undefined,
function(error) { }
)
.then(
function(str) {
alert("Je suis sauvé !");
},
function(error) {
alert("Bad Computer!");
}
);

La promesse peut être considérée comme des couches sur un oignon. Chaque then() ajoute une autre couche à l'oignon. Chaque niveau représente une activité en cours de traitement. Lorsqu'une couche se termine, le résultat est considéré comme réparé et prêt pour la couche suivante.

5. Les promesses peuvent être suspendues

Ce n'est pas parce que vous êtes prêt à exécuter une méthode then() que vous ne pouvez pas mettre en pause et en exécuter d'autres à l'avance. Pour suspendre la promesse en cours ou la faire attendre qu'une autre promesse se termine, renvoyez simplement une autre promesse dans then().

Copier le code Le code est le suivant :

var p = new Promise(/*. ..* /);

p.then(function(str) {
if(!loggedIn) {
return new Promise(/*...*/);
}
})
.then(function(str) {
alert("Done.");
})

Dans le code précédent, l'invite n'apparaîtra pas tant que le la nouvelle promesse est résolue. Il s'agit d'un moyen pratique d'introduire davantage de dépendances dans un chemin de code asynchrone existant. Par exemple, vous constaterez peut-être que la session de l'utilisateur a expiré et vous souhaiterez peut-être initialiser une deuxième connexion avant de continuer avec le chemin de code précédent.

6. Les promesses résolues ne seront pas exécutées immédiatement

Vais-je recevoir une boîte de dialogue lorsque j'exécute le code suivant ?

Copier le code Le code est le suivant :

function runme() {
var i = 0 ;

new Promise(function(resolve) {
solve();
})
.then(function() {
i = 2;
});
alert(i);
}

Étant donné que la promesse est résolue immédiatement et que la méthode then() est exécutée immédiatement, vous pourriez penser que l'invite 2 sera détectée. Mais la définition de la promesse exige que tous les appels soient forcés de manière asynchrone. Par conséquent, l'invite sera générée avant d'être modifiée.
Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal