Réécrivez le titre comme suit : Comment convertir l'API de rappel existante en formulaire de promesse ?
P粉268654873
2023-08-21 18:34:55
<p>Je souhaite utiliser des promesses pour le gérer, mais le format de mon API de rappel est le suivant : </p>
<h3>1. Chargement du DOM ou autres événements ponctuels : </h3>
<pre class="brush:php;toolbar:false;">window.onload; // Définir comme fonction de rappel
...
window.onload = fonction() {
};</pré>
<h3>2. Fonction de rappel ordinaire : </h3>
<pre class="brush:php;toolbar:false;">requête de fonction (onChangeHandler) {
...
}
requête(fonction() {
// modifié
...
});</pré>
<h3>3. Fonction de rappel de style nœud ("nodeback") : </h3>
<pre class="brush:php;toolbar:false;">function getStuff(dat, callback) {
...
}
getStuff("dataParam", fonction (erreur, données) {
...
})</pré>
<h3>4. L'ensemble de la bibliothèque utilise des fonctions de rappel de style nœud : </h3>
<pre class="brush:php;toolbar:false;">API;
API.one (fonction (erreur, données) {
API.two(function(err, data2) {
API.trois (fonction (erreur, données3) {
...
});
});
});</pré>
<h3>Comment utiliser les promesses pour gérer cette API et comment la « promettre » ? </h3>
Aujourd'hui, je peux le faire
Node.js
中使用Promise
comme une méthode Javascript normale.Un exemple
Promise
simple et basique (en utilisant la méthode KISS) :NormalCode API asynchrone Javascript :
Promise
Code API asynchrone Javascript :(Je recommande de visiter cette excellente source)
De plus,
Promise
也可以与ES7
中的asyncawait
一起使用,使程序流程等待fulfilled
peut également être utilisé avecasyncawait
dansES7
pour faire en sorte que le flux du programme attende le résultatfulfilled
, comme indiqué ci-dessous :En utilisant le même code, vous pouvez utiliser la méthode
.then()
:Promise
也可以在任何基于Node.js的平台上使用,比如react-native
Peut également être utilisé sur n'importe quelle plate-forme basée sur Node.js, telle quereact-native
.Bonus : une méthode de mixing
(Supposons que la méthode de rappel ait deux paramètres, erreur et résultat)
La méthode ci-dessus peut répondre aux résultats des rappels à l'ancienne et de l'utilisation de Promise.
J'espère que cela vous aidera.
Les promesses ont un état, elles commencent dans un état en attente et peuvent être résolues comme :
Les fonctions qui renvoient une promesse ne doivent pas lever d'exception mais doivent plutôt renvoyer un rejet. Lancer une exception à partir d'une fonction qui renvoie une promesse vous obligera à utiliser à la fois
.} catch {
} catch {
和.catch
et.catch
. Les personnes utilisant des API basées sur des promesses ne veulent pas que les promesses lèvent des exceptions. Si vous n'êtes pas sûr du fonctionnement des API asynchrones dans JS, commencez par consultez cette réponse.then
Par conséquent, créer des promesses signifie généralement préciser quand elles se résolvent, c'est-à-dire quand elles passent à l'étape Réalisée ou Rejetée pour indiquer que les données sont disponibles (et accessibles viaPromise
Utilisez une implémentation de promesse moderne (comme les promesses natives ES6) qui prend en chargeonSuccess
和onFail
Ces API sont assez courantes car les rappels sont courants en JS. Regardons les situations courantesPromise
Utilisez une implémentation de promesse moderne (comme les promesses natives ES6) qui prend en charge les constructeurs :$.Deferred(fn)
形式,它的优点是允许我们编写一个非常接近new Promise(fn)
jQuery fournit également des expressions sous la forme , comme indiqué ci-dessous :resolve
和reject
Remarque : Nous profitons ici du fait que les méthodes différées de jQuery sont « détachables », c'est-à-dire qu'elles sont liées à une instance de jQuery.Deferred() ; Toutes les bibliothèques ne proposent pas cette fonctionnalité.4. L'ensemble de la bibliothèque utilise des rappels de style Node :
Il n'y a pas de règle d'or ici, vous pouvez les transformer en engagements un à un. Cependant, certaines implémentations de promesse vous permettent de le faire par lots, par exemple dans Bluebird, convertir l'API nodeback en API de promesse est aussi simple que ceci :
ou utilisez native Promise dans Node :
Remarque :
.then
处理程序中时,当然不需要将事物转换为承诺。从.then
处理程序返回一个承诺将使用该承诺的值解决或拒绝。从.then
handler - c'est ce qu'on appelle la sécurité du lancement de promesses.onload
情况中,您应该使用addEventListener
而不是onX
.