L'utilisation de Promise consiste à résoudre le problème de la fonction de rappel imbriquée lors de l'exécution asynchrone de JS. Contrôlez de manière plus précise le processus d'exécution de la fonction ;
instancie Promise via new. Le premier paramètre est la résolution de la fonction qui sera exécutée une fois la fonction exécutée avec succès. deuxième fonction Rejetez la fonction qui sera exécutée après l'échec de l'exécution de la fonction :
new Promise(function(resolve , reject) { });
Grâce à Promesse, nous écrivons la fonction de rappel de manière linéaire au lieu de couche par couche. a quatre couches de rappels ;
fn("args", function(a) { fn1("foo", function(b) { fn2("bar", function(c) { fn3("baz", function(d) { alert("回调成功,获知的内容为:"+a+b+c+d) }) }) }) })
La démo ci-dessus n'inclut que les rappels réussis. Ce serait plus gênant si les rappels échoués étaient également comptés
Si nous utilisons Promise, nous pouvons être modifiés en ; code linéaire, il est plus conforme aux habitudes de lecture, écrivez simplement la logique sous la fonction then
new Promise(function(resolve , reject) { resolve(1); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(2); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(3); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(4); }); }).then(function(val) { console.log(val); });
Ceci est un exemple de obtention de données asynchrone, nous avons utilisé Fonction de rappel;
<html> <head> <meta charset="utf-8"> </head> <body> <script> var callback = function(res) { console.log(res); }; var ajax = function(url, callback) { var r = new XMLHttpRequest(); r.open("GET", url, true); r.onreadystatechange = function () { if (r.readyState != 4 || r.status != 200) return; var data = JSON.parse(r.responseText); callback(data); }; r.send(); }; //执行请求: ajax("http://www.filltext.com?rows=10&f={firstName}", callback); //再做别的事情; </script> </body> </html>
Étant donné que ES6 a une promesse intégrée, nous pouvons réécrire le rappel ci-dessus dans une méthode de promesse. Premièrement, la fonction ajax renvoie un objet Promise
<🎜. ><html> <head> <meta charset="utf-8"> </head> <body> <script> var callback = function(res) { console.log(res); }; var ajax = function(url) { return new Promise(function(resolve, reject) { var r = new XMLHttpRequest(); r.open("GET", url, true); r.onreadystatechange = function () { if (r.readyState != 4 || r.status != 200) return; var data = JSON.parse(r.responseText); resolve(data); }; r.send(); }) }; //执行请求: ajax("http://www.filltext.com?rows=10&f={firstName}").then(function(data) { callback(data); }); //再做别的事情; </script> </body> </html>
var promise = new Promise(function(resolve , reject) { resolve(); //执行成功回调; }); console.log(0); promise.then(function(val) { console.log(1); }, function() { console.log("失败"); }); console.log("2");
var promise = new Promise(function(resolve , reject) { reject(); }); console.log(0); promise.then(function(val) { console.log(1); }, function() { console.log("失败"); }); console.log("2");
promise
actuelle. Si une nouvelle instance de Promise est renvoyée dans la méthode then, then renverra la nouvelle instance de Promise. En utilisant cette fonctionnalité, vous pouvez implémenterMulti. -layer callbacks; Que le code soit asynchrone ou synchrone, vous pouvez utiliser la méthode then de Promise. Le code synchrone est écrit directement dans le premier paramètre de la méthode then. Les paramètres doivent être transmis à la méthode then suivante via la résolution
new Promise(function(resolve , reject) { resolve(1); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(2); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(3); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(4); }); }).then(function(val) { console.log(val); });
méthode catch :
new Promise(function(resolve , reject) { resolve(1); }).then(function(val) { console.log(val); return 2; }).then(function(val) { console.log(val); return 3; }).then(function(val) { console.log(val); return new Promise(function(resolve,reject) { //异步操作些这里 resolve(4); }); }).then(function(val) { console.log(val); return 5; }).then(function(val) { console.log(val); });
Erreur dans la promesse Elle sera transmise couche par couche. Si l'erreur n'est pas détectée, elle sera transmise à l'objet de promesse suivant,
jusqu'à ce qu'elle soit détectéevar promise = new Promise(function(resolve , reject) { resolve(); //执行成功回调; }); console.log(0); promise.then(function(val) { console.log("成功"); throw new Error("heheda"); }).catch(function(e) { console.log(e); }).then(function() { console.log("继续执行"); });
<🎜. > Les quatre méthodes du constructeur Promise :
Le constructeur Promise a quatre méthodes, Promise.all, Promise.race, Promise.reject, Promise.resolve :new Promise(function(resolve , reject) { resolve(1); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { throw new Error("err"); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(3); }); }).then(function(val) { console.log(val); return new Promise(function(resolve , reject) { resolve(4); }); }).then(function(val) { console.log(val); }).catch(function(err) { console.log(err); }).then(function() { console.log("继续执行") })
Notez que la méthode all est la . Fonction Promise
méthode, pas une méthode d'instance, le paramètre est un tableau et le tableau est constitué de toutes les instances de
: Promise.race(iterable )
var p0 = new Promise(function(resolve) { setTimeout(function() { resolve(0) },1000); }) var p1 = new Promise(function(resolve) { setTimeout(function() { resolve(1) },2000); }) var p2 = new Promise(function(resolve) { setTimeout(function() { resolve(2) },3000); }) Promise.all([p0,p1,p2]).then(function(arr) { console.log(arr) })
Lorsqu'une promesse enfant dans le paramètre itérable réussit ou échoue, la promesse parent utilisera immédiatement la valeur de retour de succès ou les détails d'échec de la promesse enfant comme paramètre pour appeler le handle correspondant lié par le promesse parent et renvoie l'objet de promesse.
Promise.reject(reason)
Appelez le handle rejeté de Promise et renvoyez cet objet Promise.
Promise.resolve(value)
Résolvez un objet Promise avec la valeur de réussite. Si la valeur est alors exploitable (c'est-à-dire avec une méthode then), l'objet Promise renvoyé « suivra » la valeur et adoptera l'état final de la valeur ; sinon, la valeur de retour utilisera cette valeur pour satisfaire (accomplir) la valeur renvoyée ; Objet de promesse.
Exemple officiel :
Maintenant que nous avons Promise, nous pouvons encapsuler le XMLHttpRequest dans une méthode GET pour une utilisation facile :
<html> <head> <meta charset="utf-8"> </head> <body> <p id="log"></p> <script> 'use strict'; var promiseCount = 0; function testPromise() { var thisPromiseCount = ++promiseCount; var log = document.getElementById('log'); log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 开始(同步代码开始)<br/>'); // 我们创建一个新的promise: 然后用'result'字符串解决这个promise (3秒后) var p1 = new Promise(function (resolve, reject) { // 解决函数带着解决(resolve)或拒绝(reject)promise的能力被执行 log.insertAdjacentHTML('beforeend', thisPromiseCount + ') Promise开始(异步代码开始)<br/>'); // 这只是个创建异步解决的示例 window.setTimeout(function () { // 我们满足(fullfil)了这个promise! resolve(thisPromiseCount) }, Math.random() * 2000 + 1000); }); // 定义当promise被满足时应做什么 p1.then(function (val) { // 输出一段信息和一个值 log.insertAdjacentHTML('beforeend', val + ') Promise被满足了(异步代码结束)<br/>'); }); log.insertAdjacentHTML('beforeend', thisPromiseCount + ') 建立了Promise(同步代码结束)<br/><br/>'); } testPromise(); </script> </body> </html>
function get(url) { // Return a new promise. return new Promise(function(resolve, reject) { // Do the usual XHR stuff var req = new XMLHttpRequest(); req.open('GET', url); req.onload = function() { // This is called even on 404 etc // so check the status if (req.status == 200) { // Resolve the promise with the response text resolve(req.response); } else { // Otherwise reject with the status text // which will hopefully be a meaningful error reject(Error(req.statusText)); } }; // Handle network errors req.onerror = function() { reject(Error("Network Error")); }; // Make the request req.send(); }); }
get('story.json').then(function(response) { console.log("Success!", response); }, function(error) { console.error("Failed!", error); });
Autres :
Ce qui précède ne sont que quelques-uns connaissance de base de Promise, et il y en a quelques autres. Les points de connaissance ne sont pas introduits un par un en raison de capacités limitées (différents paramètres de Promise.resolve, utilisés avec Generator, méthodes supplémentaires de Promise, etc.) ; Dessinez le processus en cours de Promise, à droite La compréhension de Promise sera meilleure, Promise est encore un peu déroutante
Support du navigateur :
Chrome 32, Opera 1, Firefox 29, Safari 8, Microsoft Edge, ces navigateurs sont tous pris en charge par défaut
Voici les nouvelles fonctionnalités d'ES6 : Objet JavaScript Delay intégré Le code de promesse est présenté en détail Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !