Je souhaite utiliser des promesses pour le gérer, mais le format de mon API de rappel est le suivant :
window.onload; // Définir comme fonction de rappel ... window.onload = fonction() { };2. Fonction de rappel ordinaire :
requête de fonction (onChangeHandler) { ... } requête(fonction() { // modifié ... });3. Fonction de rappel de style nœud ("nodeback") :
function getStuff(dat, callback) { ... } getStuff("dataParam", fonction (erreur, données) { ... })4. L'ensemble de la bibliothèque utilise des fonctions de rappel de style nœud :
API; API.one (fonction (erreur, données) { API.two(function(err, data2) { API.trois (fonction (erreur, données3) { ... }); }); });Comment utiliser les promesses pour gérer cette API et comment la « promettre » ?
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éthodeKISS) :NormalCode API asynchrone Javascript :
Promise
Code API asynchrone Javascript :(Je recommande de visitercette 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 demixing
(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 fonctionsqui renvoient une promesse ne doivent pas lever d'exceptionmais doivent plutôt renvoyer un rejet. Lancer une exception à partir d'une fonction qui renvoie une promesse vous obligera à utiliser à la fois
. 1. Chargement du DOM ou autres événements ponctuels :} 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 parconsultez 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 via
les constructeurs : Vous pouvez ensuite utiliser la promesse générée comme ceci : Utilisez une bibliothèque qui prend en charge le délai (ici nous utilisons $q comme exemple, mais nous utiliserons également jQuery plus tard) : Ou utilisez une API similaire à jQuery pour vous connecter à un événement qui se produit une seule fois :Promise
Utilisez une implémentation de promesse moderne (comme les promesses natives ES6) qui prend en charge2. Rappel ordinaire :
:onSuccess
和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 : Utilisez une bibliothèque qui prend en charge le délai (ici, nous utilisons jQuery comme exemple, mais nous avons également utilisé $q auparavant) :$.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 à uneinstance de jQuery.Deferred() ; Toutes les bibliothèques ne proposent pas cette fonctionnalité. 3. Rappel de style de nœud ("nodeback") : Les rappels de style nœud (nodebacks) ont un format spécifique où le rappel est toujours le dernier argument et son premier argument est l'erreur. Convertissez-le d'abord manuellement en promesse : Convertir en : En utilisant defer, vous pouvez faire ce qui suit (nous avons utilisé Q comme exemple, bien que Q prenne désormais en charge une nouvelle syntaxevous devriez préférer cette syntaxe ) : En général, vous ne devriez pas faire trop de travail manuel pour convertir des éléments en promesses, la plupart des bibliothèques de promesses conçues pour Node ainsi que les promesses natives dans Node 8+ ont des méthodes intégrées pour convertir les nodebacks en promesses. Par exemple4. 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 utiliseznative PromisedansNode:
Remarque :
.then
处理程序中时,当然不需要将事物转换为承诺。从.then
处理程序返回一个承诺将使用该承诺的值解决或拒绝。从.then
handler - c'est ce qu'on appelle la sécurité du lancement de promesses.onload
情况中,您应该使用addEventListener
而不是onX
.