2017-09-09 3 views
-1

Je passais par le lien https://developer.mozilla.org/en-US/Add-ons/WebExtensions/Your_second_WebExtension. Je ne pouvais pas comprendre le mot-clé then() dans le script choose_beast.js. Je sais que c'est quelque chose lié aux promesses en javascript. Pouvez-vous expliquer dans un langage simple les promesses et l'utilisation d'alors dans ce contexte? Comparons le code synchrone et asynchrone.promesse asynchrone, puis()

+0

https://developers.google.com/web/fundamentals/getting-started/primers/promises https://developer.mozilla.org/fr-fr/docs/Web/JavaScript/Reference/Global_Objects/Promise –

+0

Je l'ai déjà lu mais ne comprenais pas en termes simples. –

+0

En relation: [Pourquoi ma variable est-elle inchangée après que je l'ai modifiée dans une fonction? - Référence de code asynchrone] (https://stackoverflow.com/q/23667086) – Makyen

Répondre

0

Regarder un code synchrone normal:

let a = Date.now(); 
let b = a * 3; 

a est réglé avant b est réglé et il est disponible pour la ligne suivante à utiliser

Regarder un code asynchrone:

let a = someAsyncFuntion(); 
let b = a * 3; // runs into error 

a n'est PAS défini avant que b ne soit défini et il n'est pas disponible pour la ligne suivante à b e utilisé, il en résulte une erreur.

Le someAsyncFuntion() est mis en file d'attente pour s'exécuter lorsque le processus suivant est disponible. L'analyseur passe à let b = a * 3; mais ici le a n'est pas encore défini, il y aura donc une erreur. Je mots simples, dans Promise la fonction est mise en file d'attente pour s'exécuter de manière asynchrone. Par conséquent, then() est quand il l'a fait.

En regardant l'exemple à la page ci-dessus:

var gettingActiveTab = browser.tabs.query({active: true, currentWindow: true}); 
gettingActiveTab.then((tabs) => { browser.tabs.sendMessage(tabs[0].id, {beastURL: chosenBeastURL}); }); 

browser.tabs.query() ne ruisselle pas immédiatement et ne pas obtenir immédiatement. Par conséquent, nous écrivons le code de sorte que quand il obtient le résultat then() faire quelque chose.

// query tabs asynchronously 
var gettingActiveTab = browser.tabs.query({.....}); 

// once got the result THEN do something 
gettingActiveTab.then(/* do something */); 

J'espère que cela aide.