Table des matières
1. Promise 之前
2. Promise 的目的
3. Promise 的原理
4. Promise 的使用
5. 干掉Promise中的回调
6. 总结
Maison interface Web js tutoriel Exemple d'analyse du principe et de l'utilisation d'ES6 Promise

Exemple d'analyse du principe et de l'utilisation d'ES6 Promise

Aug 09, 2022 pm 03:49 PM
es6 promise

1. Promise 之前

1.1 回调函数

回调函数:把函数A当作参数传递给另一个函数B调用,那么A就是回调函数。【推荐:JavaScript视频教程

一些例子
具名回调

function 你有几只狗(fn){
    fn('一只狗')
}function 数狗(数量){
    console.log(数量)
}
你有几只狗(数狗)   // 一只狗
Copier après la connexion

匿名回调

function 你有几只狗(fn){
    fn('一只狗')
}
你有几只狗(function(数量){console.log(数量) 
})         //  一只狗
Copier après la connexion

常见的例子
jQuery中使用回调函数,这里用的是匿名回调的方式

$("#btn").click(function(){
    console.log('点到我了')
})
Copier après la connexion

1.2 回调地狱(回调缺点1)

回调地狱:指的是回调嵌套过多的情况,导致代码很难被看懂。

let info = []function 你有几只狗(fn){
    fn('一只狗')
}function 你有几只猫(fn){
    fn('一只猫')
}function 知道了(数量,callback){
    info.push(数量)
    console.log(info)    if(callback){
        callback()
    }
}// 开始调用 如果比这再多几层,就不容易看懂了你有几只狗(function(狗数){
    console.log(狗数)
    知道了(狗数, function(){
        你有几只猫(function(猫数){
            console.log(猫数)
            知道了(猫数)
        })
    })
})
Copier après la connexion

1.3 不使用Promise,如何解决

利用具名函数代替匿名函数

let info = []function 你有几只狗(fn){
    fn('一只狗')
}function 你有几只猫(fn){
    fn('一只猫')
}function 知道了(数量,callback){
    info.push(数量)
    console.log(info)    if(callback){
        callback()
    }
}function 告诉你猫的个数(猫数){
    console.log(猫数)
    知道了(猫数)
}function 继续数(){
    你有几只猫(告诉你猫的个数)
}function 告诉你狗的个数(狗数){
    console.log(狗数)
    知道了(狗数, 继续数)
}
你有几只狗(告诉你狗的个数)  // 好像也没好到哪去。。。
Copier après la connexion

1.4 回调方式各不相同,需要单独记忆(回调缺点2)

readFile('C:\\1.txt',function (error, data) {   // node.js 读取文件方法中的回调
        if(error) {
            console.log('成功')
            console.log(data.toString())
        } else {
            console.log('读取文件失败')
        }
    })

$.ajax({                              // jQuery中ajax方法中的回调
    url:'/2.txt'
    success: function(response) {
        console.log('成功')
    },
    error: function(){
        console.log('失败')
    }
})
Copier après la connexion

2. Promise 的目的

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。它由社区最早提出和实现,ES6 将其写进了语言标准,统一了用法,原生提供了Promise对象。

3. Promise 的原理

3.1 实现原理

ES6 规定,Promise对象是一个构造函数,用来生成Promise实例。通过在函数内部return 一个 Promise对象的实例,这样就可以使用Promise的属性和方法进行下一步操作了。

function 函数名(){    return new Promise(function(resolve, reject) {
        // ... some code          if (/* 异步操作成功 */){
            resolve(value);   // 异步操作成功时调用,把结果作为参数传递出去
          } else {
            reject(error);     // 异步失败时调用,把错误作为参数传递出去
          }

    })
}
Copier après la connexion

3.2 调用逻辑

Exemple danalyse du principe et de lutilisation dES6 Promise
S1和E1两个都没有报错,执行S2(resolve执行,系统认为搞定了,没报错)
S1和E1任何一个有报错,执行E2(reject执行,系统认为没搞定,报错了)

4. Promise 的使用

4.1 Promise 的属性与方法

属性
Promise.prototype 表示 Promise 构造器的原型
方法
Promise.prototype.then()
返回一个 Promise 。它最多需要有两个参数:Promise 的成功和失败情况的回调函数。
Promise.prototype.catch()
返回一个Promise,并且处理拒绝的情况。等价于Promise.prototype.then(undefined, onRejected)
Promise.prototype.finally()
finally() 方法返回一个Promise,在执行then()和catch()后,都会执行finally指定的回调函数。避免同样的语句需要在then()和catch()中各写一次的情况。
Promise.all(iterable)
返回一个 Promise 实例,iterable参数内所有的 promise 都resolved后,才回调完成resolve。
Promise.race(iterable)
返回一个 promise ,并伴随着 promise对象解决的返回值或拒绝的错误原因, 只要 iterable 中有一个 promise 对象”解决(resolve)”或”拒绝(reject)”。
Promise.resolve()
返回一个以给定值解析后的Promise对象。但如果这个值是个thenable(即带有then方法),返回的promise会“跟随”这个thenable的对象,采用它的最终状态(指resolved/rejected/pending/settled);如果传入的value本身就是promise对象,则该对象作为Promise.resolve方法的返回值返回;否则以该值为成功状态返回promise对象。
Promise.reject()
返回一个带有拒绝原因reason参数的Promise对象。

4.2 将回调地狱中的例子,改写为Promise的形式

Exemple danalyse du principe et de lutilisation dES6 Promise
可以看到使用 Promise后,逻辑变得非常直观
写得更完整一些
Exemple danalyse du principe et de lutilisation dES6 Promise
Promise套Promise时,也就是Promise链的时候——注意信息的传递
一个失败的例子,当我们使用Promise链的时候,如果每一步都需要上一步的数据时,就需要传参,成功通过resolve传参,失败通过reject传参,如果忘记传参,就得不到想要的结果。
resolve把成功的数据返回给下一个回调
reject把失败的数据返回给下一个回调。
Exemple danalyse du principe et de lutilisation dES6 Promise
给这里的resolve传一个参
Exemple danalyse du principe et de lutilisation dES6 Promise
改成失败的例子
先不给reject传参,如果失败的话,下一个回调拿不到数据
Exemple danalyse du principe et de lutilisation dES6 Promise
给 reject传参
Exemple danalyse du principe et de lutilisation dES6 Promise
我们可以看到,即使是走的失败回调,下一个成功回调还是执行了,由于 不知道() 默认返回undefined, 相当于失败已经处理了,在成功和失败都被处理的情况下,下一个回调会执行的。
改成符合预期的,即失败不调用。
Exemple danalyse du principe et de lutilisation dES6 Promise
失败不调用的简写形式
Exemple danalyse du principe et de lutilisation dES6 Promise
上述情况执行后 .then(除了狗呢)里面的成功回调没有执行,我们增加一个失败回调看看
Exemple danalyse du principe et de lutilisation dES6 Promise
同样也可以返回 resolve,让后面成功回调可以执行
Exemple danalyse du principe et de lutilisation dES6 Promise

4.3 应用

加载图片
将图片的加载写成一个Promise,一旦加载完成,Promise的状态就发生变化。

const preloadImage = function (path) {
  return new Promise(function (resolve, reject) {
    const image = new Image();
    image.onload  = resolve;
    image.onerror = reject;
    image.src = path;
  });
};
Copier après la connexion

Generator 函数与 Promise 的结合(详情见参考链接,阮一峰的教程)

5. 干掉Promise中的回调

5.1 await

成功的情况
Exemple danalyse du principe et de lutilisation dES6 Promise
失败的情况
利用 try catch
Exemple danalyse du principe et de lutilisation dES6 Promise
await 配合 try catch使用,比较完整

6. 总结

能利用Promise对象,把普通函数改成返回Promise的形式,解决回调地狱的问题。
明白Promise的成功失败调用逻辑,可以灵活的进行调整。
理解核心知识,先用起来,慢慢整合吸收知识。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Où trouver la courte de la grue à atomide atomique
1 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

L'async est-il pour es6 ou es7 ? L'async est-il pour es6 ou es7 ? Jan 29, 2023 pm 05:36 PM

async est es7. async et wait sont de nouveaux ajouts à ES7 et sont des solutions pour les opérations asynchrones ; async/await peut être considéré comme un sucre syntaxique pour les modules co et les fonctions de générateur, résolvant le code asynchrone js avec une sémantique plus claire. Comme son nom l'indique, async signifie « asynchrone ». Async est utilisé pour déclarer qu'une fonction est asynchrone ; il existe une règle stricte entre async et wait. Les deux sont inséparables l'un de l'autre et wait ne peut être écrit que dans des fonctions asynchrones.

Que dois-je faire si je rencontre une TypeError non capturée (promise) dans une application Vue ? Que dois-je faire si je rencontre une TypeError non capturée (promise) dans une application Vue ? Jun 25, 2023 pm 06:39 PM

Vue est un framework frontal populaire et vous rencontrez souvent diverses erreurs et problèmes lors du développement d'applications. Parmi eux, Uncaught(inpromise)TypeError est un type d’erreur courant. Dans cet article, nous discuterons de ses causes et de ses solutions. Qu'est-ce qu'une erreur de type non interceptée (inpromise) ? L'erreur Uncaught(inpromise)TypeError apparaît généralement dans

Tenir parole : les avantages et les inconvénients de tenir ses promesses Tenir parole : les avantages et les inconvénients de tenir ses promesses Feb 18, 2024 pm 08:06 PM

Dans la vie quotidienne, nous rencontrons souvent des problèmes entre promesses et réalisation. Que ce soit dans une relation personnelle ou dans une transaction commerciale, tenir ses promesses est essentiel pour instaurer la confiance. Cependant, les avantages et les inconvénients de l’engagement sont souvent controversés. Cet article explorera les avantages et les inconvénients des engagements et donnera quelques conseils sur la façon de tenir parole. Les avantages promis sont évidents. Premièrement, l’engagement renforce la confiance. Lorsqu’une personne tient parole, elle fait croire aux autres qu’elle est une personne digne de confiance. La confiance est le lien établi entre les personnes, qui peut les rendre plus

Pourquoi le mini-programme doit-il convertir es6 en es5 ? Pourquoi le mini-programme doit-il convertir es6 en es5 ? Nov 21, 2022 pm 06:15 PM

Pour la compatibilité du navigateur. En tant que nouvelle spécification pour JS, ES6 ajoute de nombreuses nouvelles syntaxes et API. Cependant, les navigateurs modernes ne prennent pas en charge les nouvelles fonctionnalités d'ES6, le code ES6 doit donc être converti en code ES5. Dans les outils de développement Web WeChat, babel est utilisé par défaut pour convertir le code de syntaxe ES6 du développeur en code ES5 bien pris en charge par les trois terminaux, aidant les développeurs à résoudre les problèmes de développement causés par différents environnements uniquement dans le projet. Il suffit de configurer et de vérifier le ; Option "ES6 à ES5".

Comment implémenter la déduplication de tableau dans es5 et es6 Comment implémenter la déduplication de tableau dans es5 et es6 Jan 16, 2023 pm 05:09 PM

Dans es5, vous pouvez utiliser l'instruction for et la fonction indexOf() pour réaliser la déduplication de tableau. La syntaxe "for(i=0;i<array length;i++){a=newArr.indexOf(arr[i]);if( a== -1){...}}". Dans es6, vous pouvez utiliser l'opérateur spread, Array.from() et Set pour supprimer la duplication ; vous devez d'abord convertir le tableau en un objet Set pour supprimer la duplication, puis utiliser l'opérateur spread ou la fonction Array.from(). pour reconvertir l'objet Set en un groupe Just.

Que signifie la zone morte temporaire es6 ? Que signifie la zone morte temporaire es6 ? Jan 03, 2023 pm 03:56 PM

Dans es6, la zone morte temporaire est une erreur de syntaxe, qui fait référence aux commandes let et const qui font que le bloc forme une portée fermée. Dans un bloc de code, avant qu'une variable ne soit déclarée à l'aide de la commande let/const, la variable est indisponible et appartient à la « zone morte » de la variable avant que la variable ne soit déclarée ; c'est ce qu'on appelle syntaxiquement une « zone morte temporaire ». ES6 stipule que la promotion des variables ne se produit pas dans les zones mortes temporaires et dans les instructions let et const, principalement pour réduire les erreurs d'exécution et empêcher l'utilisation de la variable avant qu'elle ne soit déclarée, ce qui peut entraîner un comportement inattendu.

En savoir plus sur Promise.resolve() En savoir plus sur Promise.resolve() Feb 18, 2024 pm 07:13 PM

Une explication détaillée de Promise.resolve() nécessite des exemples de code spécifiques. Promise est un mécanisme en JavaScript pour gérer les opérations asynchrones. Dans le développement réel, il est souvent nécessaire de traiter certaines tâches asynchrones qui doivent être exécutées dans l'ordre, et la méthode Promise.resolve() est utilisée pour renvoyer un objet Promise qui a été rempli. Promise.resolve() est une méthode statique de la classe Promise, qui accepte un

L'importation ES6 favorisera-t-elle les variables ? L'importation ES6 favorisera-t-elle les variables ? Jan 18, 2023 pm 07:44 PM

L’importation ES6 entraînera une promotion variable. Le levage de variable est le processus consistant à hisser une déclaration de variable au début de sa portée. js doit passer par les phases de compilation et d'exécution. Pendant la phase de compilation, toutes les déclarations de variables seront collectées et les variables déclarées à l'avance, tandis que les autres instructions ne changeront pas leur ordre. Par conséquent, pendant la phase de compilation, la première étape est déjà terminée. exécutée, et la deuxième partie n'est exécutée que lorsque l'instruction est exécutée dans la phase d'exécution.

See all articles