Heim Web-Frontend js-Tutorial Einige gängige Anwendungsszenarien von Front-End-Promise

Einige gängige Anwendungsszenarien von Front-End-Promise

Jun 15, 2020 am 10:08 AM
promise

In diesem Artikel werden die gängigen Anwendungsszenarien von Promise in unserer Projektentwicklung basierend auf meiner eigenen Verwendung von ES6 Promise zusammengefasst. Natürlich ist Promise möglicherweise nicht die einzige Option, aber als qualifizierter Front-End-Entwickler müssen wir es verstehen Es.

Promise.all


Syntax: Promise.all (iterierbar)

Parameter: ein iterierbares Objekt, z. B. Array.

Rückgabewert:

  • Wenn das übergebene Iterable leer ist, handelt es sich um ein aufgelöstes Promise.

Promise.all([]).then(res=>{
    console.log(res)//[]
})
Nach dem Login kopieren
  • Ein Versprechen, das asynchron aufgelöst wird (wenn das übergebene Iterable kein Versprechen enthält). Beachten Sie, dass Google Chrome 58 in diesem Fall eingelöste Versprechen zurückgibt.

Promise.all([1,2,3]).then(res=>{
    console.log(res)//[1,2,3]
})
Nach dem Login kopieren
  • Dieses zurückgegebene Versprechen wird asynchron aufgelöst/abgelehnt, wenn alle Versprechen in der angegebenen Iterable aufgelöst wurden oder wenn ein Versprechen abgelehnt wurde (wenn der Stapel ist leer)

    1. Wenn alle Versprechen im gegebenen iterierbaren Objekt aufgelöst wurden

let promise1 = new Promise((resolve,reject)=>{
    resolve(1)
})
let promise2 = new Promise((resolve,reject)=>{
    resolve(2)
})

Promise.all([promise1,promise2,3]).then(res=>{
    console.log(res)//[1,2,3]
})
Nach dem Login kopieren

2. Wenn alle Versprechen im gegebenen iterierbaren Objekt aufgelöst wurden. Wenn irgendein Versprechen wird abgelehnt

let promise1 = new Promise((resolve,reject)=>{
    resolve(1)
})
let promise2 = new Promise((resolve,reject)=>{
    reject(2)
})

Promise.all([promise1,promise2,3]).then(res=>{
    console.log(res)
}).catch(err=>{
    console.log(err)//2
})
Nach dem Login kopieren

Beschreibung:

Diese Methode ist nützlich, um die Ergebnisse mehrerer Versprechen zu aggregieren. In ES6 können mehrere asynchrone Promise.all-Anfragen parallel ausgeführt werden:

1. Wenn alle Ergebnisse erfolgreich zurückgegeben werden, wird der Erfolg in der Anforderungsreihenfolge zurückgegeben.

2. Wenn eine Fehlermethode vorliegt, geben Sie die Fehlermethode 1 ein. Mehrere Anfrageergebnisse werden zusammengeführt

Detaillierte Beschreibung: Eine Seite hat mehrere Anfragen. Wir benötigen alle Anfragen, um Daten zurückzugeben, bevor wir das Rendering zusammen verarbeiten

Denke: Bei gleichzeitigen Anfragen muss der Ladestatus für jede Anfrage separat festgelegt werden. Bei mehreren Ladevorgängen kann es zu Überschneidungen kommen. Der auf der Seite angezeigte Inhalt hängt von der Geschwindigkeit ab, mit der die Daten zurückgegeben werden Dies spiegelt sich insbesondere im Rendering-Prozess wider. Um die Benutzererfahrung zu verbessern, können wir alle Anforderungen verwenden, um Daten zurückzugeben und sie dann zusammen zu rendern. Zu diesem Zeitpunkt deaktivieren wir die separate Ladeeinstellung der Anforderung und fassen die Anforderungsergebnisse über Promise zusammen .all. Von Anfang bis Ende legen wir nur eine Ladung fest.

//1.获取轮播数据列表
function getBannerList(){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('轮播数据')
        },300)
    })
}

//2.获取店铺列表
function getStoreList(){
   return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('店铺数据')
        },500)
    })
}

//3.获取分类列表
function getCategoryList(){
   return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('分类数据')
        },700)
    })
}

function initLoad(){
    // loading.show() //加载loading
    Promise.all([getBannerList(),getStoreList(),getCategoryList()]).then(res=>{
        console.log(res)
        // loading.hide() //关闭loading
    }).catch(err=>{
        console.log(err)
        // loading.hide()//关闭loading
    })
}
//数据初始化    
initLoad()
Nach dem Login kopieren


Anwendungsszenario 2: Anforderungsergebnisse zusammenführen und Fehler behandeln

Beschreibung: Wir müssen die Datenrendering- und Fehlerbehandlungslogik von a verwalten Wenn es mehrere Anfragen gibt, müssen wir

an mehreren Stellen schreiben: Können wir mehrere Anfragen zusammenführen, werden sie nur an uns zurückgegeben Verwalten Sie einfach die Daten- und Fehlerlogik an einem Ort.

//1.获取轮播图数据列表
function getBannerList(){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            // resolve('轮播图数据')
            reject('获取轮播图数据失败啦')
        },300)
    })
}

//2.获取店铺列表
function getStoreList(){
   return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('店铺数据')
        },500)
    })
}

//3.获取分类列表
function getCategoryList(){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve('分类数据')
        },700)
    })
}

function initLoad(){
    // loading.show()
    Promise.all([
        getBannerList().catch(err=>err),
        getStoreList().catch(err=>err),
        getCategoryList().catch(err=>err)
    ]).then(res=>{
        console.log(res) // ["获取轮播图数据失败啦", "店铺数据", "分类数据"]
        
        if(res[0] == '轮播图数据'){
            //渲染
        }else{
            //获取 轮播图数据 失败的逻辑
        }
        if(res[1] == '店铺数据'){
            //渲染
        }else{
            //获取 店铺列表数据 失败的逻辑
        }
        if(res[2] == '分类数据'){
            //渲染
        }else{
             //获取 分类列表数据 失败的逻辑
        }
        
        // loading.hide()
    })
}

initLoad()
Nach dem Login kopieren

Manchmal hängt die Seite auf, vielleicht aufgrund einer Schnittstellenausnahme, oder vielleicht ist es nur eine unbedeutende Schnittstelle, die aufhängt. Warum hängt sich eine Schnittstelle auf, was dazu führt, dass auf der gesamten Seite keine Daten vorhanden sind? Promise.all teilt uns mit, dass der Callback der then-Methode nicht mehr ausgeführt wird, wenn ein Versprechen im Parameter fehlschlägt (abgelehnt) und der Rückruf dieser Instanz fehlschlägt

Anwendungsszenario 3: Überprüfen Sie, ob mehrere Anfrageergebnisse die Bedingungen erfüllen

Beschreibung: Führen Sie in einem WeChat-Applet-Projekt eine Sicherheitsüberprüfung des Eingabeinhalts eines Formulars durch. aufgerufen Es handelt sich um eine von Cloud-Funktionen geschriebene Methode. Es gibt 7 Felder im Formular, die überprüft werden müssen. Sie werden alle von einer Schnittstelle zur Inhaltssicherheitsüberprüfung aufgerufen. Wenn alle Überprüfungen erfolgreich sind, kann die normale Übermittlung durchgeführt werden 🎜>

function verify1(content){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve(true)
        },200)
    })
}

function verify2(content){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve(true)
        },700)
    })
}

function verify3(content){
    return new Promise((resolve,reject)=>{
        setTimeout(function(){
            resolve(true)
        },300)
    })
}



Promise.all([verify1('校验字段1的内容'),verify2('校验字段2的内容'),verify3('校验字段3的内容')]).then(result=>{
    console.log(result)//[true, true, true]

    let verifyResult = result.every(item=>item)
    //验证结果
    console.log(verifyResult?'通过验证':'未通过验证')// 通过验证
}).catch(err=>{
    console.log(err)
})
Nach dem Login kopieren

Promise .race

Syntax: Promise.race(iterable)


Parameter: iterierbares iterierbares Objekt, z. B. Array. Iterierbar.

Rückgabewert: Die Promise.race(iterable)-Methode gibt ein Versprechen zurück, sobald ein Versprechen im Iterator aufgelöst oder abgelehnt wird, wird das zurückgegebene Versprechen aufgelöst oder abgelehnt

BeschreibungDie Race-Funktion gibt ein Versprechen zurück, das auf die gleiche Weise erfüllt wird wie das zuerst übergebene Versprechen. Es kann entweder aufgelöst (aufgelöst) werden oder fehlschlagen (zurückgewiesen), je nachdem, welche der beiden Aufgaben zuerst abgeschlossen wurde.

Wenn die übergebene Iteration leer ist, wird das zurückgegebene Versprechen ewig warten.

Wenn die Iteration einen oder mehrere Nicht-Versprechenswerte und/oder gelöste/abgelehnte Versprechen enthält, löst Promise.race den ersten in der Iteration gefundenen Wert auf.

Anwendungsszenario 1: Zeitüberschreitung bei Bildanforderung

//请求某个图片资源
function requestImg(){
    var p = new Promise(function(resolve, reject){
        var img = new Image();
        img.onload = function(){
           resolve(img);
        }
        //img.src = "https://b-gold-cdn.xitu.io/v3/static/img/logo.a7995ad.svg"; 正确的
        img.src = "https://b-gold-cdn.xitu.io/v3/static/img/logo.a7995ad.svg1";
    });
    return p;
}

//延时函数,用于给请求计时
function timeout(){
    var p = new Promise(function(resolve, reject){
        setTimeout(function(){
            reject('图片请求超时');
        }, 5000);
    });
    return p;
}

Promise
.race([requestImg(), timeout()])
.then(function(results){
    console.log(results);
})
.catch(function(reason){
    console.log(reason);
});
Nach dem Login kopieren

Anwendungsszenario 2: Zeitüberschreitung bei Anforderungsaufforderung

Beschreibung: Manchmal lesen wir in einer Sekunde die Nachrichten, und nachdem wir den Aufzug betreten, werden wir in der nächsten Sekunde auf der Mobiltelefonseite darauf hingewiesen, dass „das Netz nicht gut ist“

//请求
function request(){
    return new Promise(function(resolve, reject){
       setTimeout(()=>{
            resolve('请求成功')
       },4000)
    })
}

//请求超时提醒
function timeout(){
    var p = new Promise(function(resolve, reject){
        setTimeout(function(){
            reject('网络不佳');
        }, 3000);
    });
    return p;
}



Promise.race([
    request(),
    timeout()
])
.then(res=>{
    console.log(res)
}).catch(err=>{
    console.log(err)//网络不佳
})
Nach dem Login kopieren

Versprochen .prototype.then

Anwendungsszenario 1: Die nächste Anfrage hängt vom Ergebnis der vorherigen Anfrage ab

描述:类似微信小程序的登录,首先需要 执行微信小程序的 登录 wx.login 返回了code,然后调用后端写的登录接口,传入 code ,然后返回 token ,然后每次的请求都必须携带 token,即下一次的请求依赖上一次请求返回的数据

function A(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve('B依赖的数据')
        },300)
    })
}
function B(prams){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(prams + 'C依赖的数据')
        },500)
    })
}
function C(prams){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(prams)
        },1000)
    })
}

//我们期望的是走 try ,由于A B C模拟的请求中都是没有reject,用 try catch 捕获错误
try{
    A().then( res=>B(res) ).then( res=>C(res) ).then( res=>{
        console.log(res)//B依赖的数据C依赖的数据
    })   
} catch(e){
    
}
Nach dem Login kopieren

应用场景2:中间件功能使用

描述:接口返回的数据量比较大,在一个then 里面处理 显得臃肿,多个渲染数据分别给个then,让其各司其职

//模拟后端返回的数据

let result = {
    bannerList:[
        {img:'轮播图地址'}
    //...
    ],
    storeList:[
        {name:'店铺列表'}
    //...
    ],
    categoryList:[
        {name:'分类列表'}
    //...
    ],
    //...
}

function getInfo(){
    return new Promise((resolve,reject)=>{
        setTimeout(()=>{
            resolve(result)
        },500)
    })
}

getInfo().then(res=>{

    let { bannerList } = res
    //渲染轮播图
    console.log(bannerList)
    return res
}).then(res=>{
    
    let { storeList } = res
    //渲染店铺列表
    console.log(storeList)
    return res
}).then(res=>{
    let { categoryList } = res
    console.log(categoryList)
    //渲染分类列表
    
    return res
})
Nach dem Login kopieren

推荐教程:《JS教程

Das obige ist der detaillierte Inhalt vonEinige gängige Anwendungsszenarien von Front-End-Promise. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Halten Sie Ihr Wort: Die Vor- und Nachteile der Einhaltung Ihrer Versprechen Halten Sie Ihr Wort: Die Vor- und Nachteile der Einhaltung Ihrer Versprechen Feb 18, 2024 pm 08:06 PM

Im täglichen Leben stoßen wir oft auf Probleme zwischen Versprechen und Erfüllung. Ob in einer persönlichen Beziehung oder einer Geschäftstransaktion: Das Einhalten von Versprechen ist der Schlüssel zum Aufbau von Vertrauen. Allerdings sind die Vor- und Nachteile eines Engagements oft umstritten. In diesem Artikel werden die Vor- und Nachteile von Verpflichtungen untersucht und einige Ratschläge gegeben, wie Sie Ihr Wort halten können. Die versprochenen Vorteile liegen auf der Hand. Erstens schafft Engagement Vertrauen. Wenn jemand sein Wort hält, lässt er andere glauben, dass er eine vertrauenswürdige Person ist. Vertrauen ist die Bindung zwischen Menschen, die Menschen mehr machen kann

Was soll ich tun, wenn in einer Vue-Anwendung ein nicht erfasster (versprechender) TypeError auftritt? Was soll ich tun, wenn in einer Vue-Anwendung ein nicht erfasster (versprechender) TypeError auftritt? Jun 25, 2023 pm 06:39 PM

Vue ist ein beliebtes Front-End-Framework, und bei der Entwicklung von Anwendungen treten häufig verschiedene Fehler und Probleme auf. Unter diesen ist Uncaught(inpromise)TypeError ein häufiger Fehlertyp. In diesem Artikel werden wir die Ursachen und Lösungen diskutieren. Was ist Uncaught(inpromise)TypeError? Der Fehler Uncaught(inpromise)TypeError tritt normalerweise auf

Erfahren Sie mehr über Promise.resolve() Erfahren Sie mehr über Promise.resolve() Feb 18, 2024 pm 07:13 PM

Eine detaillierte Erklärung von Promise.resolve() erfordert spezifische Codebeispiele. Promise ist ein Mechanismus in JavaScript zur Verarbeitung asynchroner Vorgänge. In der tatsächlichen Entwicklung ist es häufig erforderlich, einige asynchrone Aufgaben zu verarbeiten, die nacheinander ausgeführt werden müssen, und die Methode Promise.resolve () wird verwendet, um ein erfülltes Promise-Objekt zurückzugeben. Promise.resolve() ist eine statische Methode der Promise-Klasse, die a akzeptiert

Beispielhafte Analyse des Prinzips und der Verwendung von ES6 Promise Beispielhafte Analyse des Prinzips und der Verwendung von ES6 Promise Aug 09, 2022 pm 03:49 PM

Verwenden Sie Promise-Objekte, um gewöhnliche Funktionen so zu ändern, dass sie Promise zurückgeben, um das Problem der Rückrufhölle zu lösen. Verstehen Sie die Erfolgs- und Misserfolgslogik von Promise und nehmen Sie Anpassungen flexibel vor. Verstehen Sie das Kernwissen, wenden Sie es zuerst an und integrieren und absorbieren Sie das Wissen langsam.

Welche Browser unterstützen Promise? Welche Browser unterstützen Promise? Feb 19, 2024 pm 04:41 PM

Browserkompatibilität: Welche Browser unterstützen Promises? Da die Komplexität von Webanwendungen immer weiter zunimmt, sind Entwickler bestrebt, das Problem der asynchronen Programmierung in JavaScript zu lösen. In der Vergangenheit verwendeten Entwickler häufig Callback-Funktionen, um asynchrone Vorgänge abzuwickeln. Dies führte jedoch zu komplexem und schwer zu wartendem Code. Um dieses Problem zu lösen, hat ECMAScript6 Promise eingeführt, das eine intuitivere und flexiblere Möglichkeit zur Handhabung asynchroner Vorgänge bietet. Promise ist eine Methode zur Behandlung von Ausnahmen

Was sind Versprechensobjekte? Was sind Versprechensobjekte? Nov 01, 2023 am 10:05 AM

Die Status des Versprechensobjekts sind: 1. Ausstehend: Ausgangszustand, weder Erfolg noch Fehler; 2. Erfüllt: bedeutet, dass der Vorgang erfolgreich abgeschlossen wurde. 3. Abgelehnt: bedeutet, dass der Vorgang fehlgeschlagen ist. Sobald ein Promise-Objekt abgeschlossen ist, wechselt es vom Status „Ausstehend“ in den Status „Erfüllt“ oder „Abgelehnt“ und kann sich nicht erneut ändern. Promise-Objekte werden in JavaScript häufig zur Verarbeitung asynchroner Vorgänge wie AJAX-Anfragen und zeitgesteuerter Vorgänge verwendet.

Welche Vorteile haben PHP-Funktionen, die Promise-Objekte zurückgeben? Welche Vorteile haben PHP-Funktionen, die Promise-Objekte zurückgeben? Apr 19, 2024 pm 05:03 PM

Vorteile: asynchron und nicht blockierend, blockiert den Hauptthread nicht; verbessert die Lesbarkeit und Wartbarkeit des Codes;

Was bedeutet Versprechen? Was bedeutet Versprechen? Nov 02, 2023 pm 05:30 PM

Promise ist ein Programmiermuster für die Verarbeitung asynchroner Operationen. Es kann als Verpflichtung zur asynchronen Operation angesehen werden, wodurch der Code besser verwaltet und organisiert werden kann besser lesbar und wartbar. Versprechensobjekte haben drei Zustände: ausstehend, erfüllt und abgelehnt. Die Kernidee von Promise besteht darin, asynchrone Operationen von Rückruffunktionen zu trennen und die Abhängigkeiten zwischen asynchronen Operationen durch Kettenaufrufe auszudrücken.

See all articles