国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

異步同步化( Promise 詳解)

這篇具有很好參考價值的文章主要介紹了異步同步化( Promise 詳解)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

ES 6 Promise的用法

一 、為什么要使用Promise

“ 回調(diào)地獄 ”這個詞,不知道大家聽過沒有,就是異步調(diào)用獲取到結(jié)果后,

為下一個異步函數(shù)提供 參數(shù),所以就會一層一層的出現(xiàn)回調(diào)里面 嵌入回調(diào),導(dǎo)致層次很深,代碼維護起來特別的復(fù)雜,看一下下面的小案例大家就知道什么意思了。

以uni.request( ) 為例

下面的舉例就 以uniapp里面的網(wǎng)絡(luò)請求uni.request()為例了,

如果你做的是微信小程序wx.request()也是一樣的,還有jQuery的ajax(),

這些都是異步請求 ,

通過success回調(diào)函數(shù)獲取數(shù)據(jù)的,

那有童鞋會問為什么不適用vue的axios那,因為axios網(wǎng)絡(luò)請求已經(jīng)封裝了promise了。

getData(){
  //獲取分類列表id
  uni.request({
    url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
    success:res=>{
      let id=res.data[0].id
      // 根據(jù)分類id獲取該分類下的所有文章
      uni.request({
        url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
        data:{
          cid:id
        },
        success:res2=>{
          //獲取到一篇文章的id,根據(jù)文章id找到該文章下的評論
          let id=res2.data[0].id;
          uni.request({
            url:"https://ku.qingnian8.com/dataApi/news/comment.php",
            data:{
              aid:id
            },
            success:res3=>{
              //找到該文章下所有的評論
              console.log(res3)
            }
          })
        }
      })

    }
  })
}

大家看到上的代碼了沒有,數(shù)一數(shù)有幾層嵌套,出現(xiàn)了幾個success回調(diào),這個案例的嵌套還算是少的那,還有比這更夸張的,這就是所謂的回調(diào)地獄,層層嵌套,要是維護起這樣的代碼來,直接會把新手勸退的,自己寫過的代碼要是不加注釋也不知道這到底是干嘛的。

在沒有ES6的promise時候原來是怎么優(yōu)化的那,把每一個request請求封裝出一個函數(shù)將結(jié)果進行返回,這就是原來常用的回調(diào)函數(shù)方案,將上述代碼可以改造成如下代碼:

1 . 0 版本 ( 封裝函數(shù) )

調(diào)用部分 ↓

//在onload初始化后調(diào)用相應(yīng)的函數(shù)
onLoad() {
  //調(diào)用導(dǎo)航函數(shù),并拿到函數(shù)的返回值
  this.getNav(res=>{
    let id=res.data[0].id;
    //拿到分類id作為參數(shù)
    this.getArticle(id,res2=>{
      //拿到文章id作為參數(shù)
      let id=res2.data[0].id;
      this.getComment(id,res3=>{
        //最終獲取到第一個分類下,第一篇文章下,所有評論
        console.log(res3)
      })
    })
  });
} 

**封裝的函數(shù)部分↓ **

methods: {
    //先獲取導(dǎo)航分類接口,將結(jié)果進行返回,到調(diào)用函數(shù)的地方獲取
    getNav(callback){
      uni.request({
        url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
        success:res=>{
          callback(res)
        }
      })
    },

    //獲取文章數(shù)據(jù),將文章列表進行返回
    getArticle(id,callback){
      uni.request({
        url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
        data:{
          cid:id
        },
        success:res=>{
          callback(res)
        }
      })
    },

      //獲取文章下的所有評論
      getComment(id,callback){
        uni.request({
          url:"https://ku.qingnian8.com/dataApi/news/comment.php",
          data:{
            aid:id
          },
          success:res=>{
            callback(res)
          }
        })
      }
} 

小結(jié): 我們通過封裝 方法 從而簡化代碼 讓代碼看起來更加清晰 ( 至少在看調(diào)用函數(shù)方面 會更加清晰 ), 但是并沒有很好解決回調(diào)地獄的問題

二 、什么是 Promise

promise是解決異步的方法,本質(zhì)上是一個構(gòu)造函數(shù),

可以用它實例化一個對象。對象身上有resolve、reject、all,原型上有then、catch方法。

promise對象有三種狀態(tài):

pending(初 識狀態(tài)/進行中)、resolved或fulfilled(成功)、rejected(失?。?/code>

下面我們直接打印一下 Promise

console.dir(Promise) 

[外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-mVlwddYH-1675075189316)(C:\Users\admin\AppData\Roaming\Typora\typora-user-images\image-20230130121411121.png)]

三 、將回調(diào)函數(shù)修改為 Promise 方案
2.0 版本 ( Promise 對象 )

.then 的鏈?zhǔn)秸{(diào)用函數(shù)

//promise鏈?zhǔn)秸{(diào)用
this.getNav().then(res=>{
  let id=res.data[0].id;
  return this.getArticle(id);
}).then(res=>{
  let id=res.data[0].id;
  return this.getComment(id)
}).then(res=>{
  console.log(res)
}) 

函數(shù)封裝也需要進行修改

methods: {
    //先獲取導(dǎo)航分類接口,將結(jié)果進行返回,到調(diào)用函數(shù)的地方獲取
    getNav(callback){
      return new Promise((resolve,reject)=>{
        uni.request({
          url:"https://ku.qingnian8.com/dataApi/news/navlist.php",
          success:res=>{
            resolve(res)
          },
          fail:err=>{
            reject(err)
          }
        })
      })
    },


    //獲取文章數(shù)據(jù),將文章列表進行返回
    getArticle(id){
      return new Promise((resolve,reject)=>{
        uni.request({
          url:"https://ku.qingnian8.com/dataApi/news/newslist.php",
          data:{
            cid:id
          },
          success:res=>{
            resolve(res)
          },
          fail:err=>{
            reject(err)
          }
        })
      })
    },

      //獲取文章下的所有評論
      getComment(id){
        return new Promise((resolve,reject)=>{
          uni.request({
            url:"https://ku.qingnian8.com/dataApi/news/comment.php",
            data:{
              aid:id
            },
            success:res=>{
              resolve(res)
            },
            fail:err=>{
              reject(err)
            }
          })
        })
} 

看完上面兩段代碼 , 下面我們進行詳細的分析

很多初學(xué)者不是很清楚 .then 以及里面的一些參數(shù)等等
下面, 我們結(jié)合 上面的案例進行講解
首先, 在上面, 我們通過 console.log(Promise) 可以知道里面
包括了 then() catch() 等方法
所以我們要原來的調(diào)用函數(shù)的返回值 改成
返回 Promise 對象
在此之前我們需要對 // 對象 進行實例化 
如下面:
getNav(callback){
      return new Promise((resolve,reject)=>{ 
      ........
      })
},
// 也可以下面這種寫法
getNav(callback){
    // 實例化
      let p = new Promise((resolve,reject)=>{ 
      ........
      })
      return p
},

有關(guān)于實例化 Promise 中的兩個參數(shù) (resolve,reject)

// 和 1.0 版本中 callblack 的作用差不多 主要起了回調(diào)數(shù)據(jù)的作用
// 不過, resolve 是表示運行成功的返回的數(shù)據(jù)  reject是表示運行失敗返回的數(shù)據(jù)
 getNav(callback){
      return new Promise((resolve,reject)=>{
        uni.request({
       	  ........,
          success:res=>{
            resolve(res)
          },
          fail:err=>{
            reject(err)
          }
        })
      })
    }, 
四、await / async ES7的新規(guī)范,異步處理同步化

注意

// await / async 兩者需要一起使用, 才能起作用, 缺一不可
如果使用了await 沒有在函數(shù)中使用async 命令, 就會報錯
如果使用了async 沒有使用await 不會報錯 但沒有意義
3 . 0 版本
async onLoad() {
  let id,res;
  res=await this.getNav();
  id=res.data[0].id;
  res=await this.getArticle(id);
  id=res.data[0].id;
  res=await this.getComment(id);
  console.log(res)
} 

關(guān)于封裝函數(shù)部分和 then的鏈?zhǔn)秸{(diào)用的封裝的代碼一樣

特別聲明: 本文章并非本人完全原創(chuàng), 只是對蝦米老師的筆記進行簡化以及添加一些自己的見解
還有就是 如果筆記有什么問題, 歡迎大家在評論區(qū)或者私信或者我們的交流群斧正。
我也是小白,希望和大家一起進步。
最后祝大家新年快樂!!!! 

課程鏈接: https://www.bilibili.com/video/BV1XW4y1v7Md?share_source=copy_web文章來源地址http://www.zghlxwxcb.cn/news/detail-593782.html

到了這里,關(guān)于異步同步化( Promise 詳解)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 詳解uniapp的全局變量實現(xiàn)方式_javascript技巧

    本文整理了一些uniapp全局變量的實現(xiàn)方式,細節(jié)知識來自于uView官網(wǎng)中對uniapp中的全局變量實現(xiàn),感興趣的同學(xué)可以前往uView官網(wǎng)搜索vuex進行查看 一般來說在uniapp中有以下幾種方式 本地存儲 配置文件 掛載到 Vue.prototype globalData vuex 下面對這5種方式的實現(xiàn)進行介紹 永久存儲,

    2024年02月07日
    瀏覽(26)
  • JavaScript Promise

    JavaScript Promise 是一種用于處理異步操作的對象。它表示一個異步操作的最終完成或失敗,并且可以處理操作的結(jié)果或錯誤。 Promise 對象有三種狀態(tài): 1. Pending(進行中):初始狀態(tài),表示操作正在進行中,既不是成功也不是失敗。 2. Fulfilled(已完成):表示操作成功完成,并

    2024年02月06日
    瀏覽(20)
  • JavaScript 之 promise

    JavaScript 之 promise

    封裝和調(diào)用不是同一個人,不清楚如何調(diào)用 設(shè)計者不好設(shè)計,調(diào)用者調(diào)用很麻煩 從一個實際的例子來作為切入點: 調(diào)用一個函數(shù),這個函數(shù)中發(fā)送網(wǎng)絡(luò)請求(可以用定時器來模擬) 如果發(fā)送網(wǎng)絡(luò)請求成功了,那么告知調(diào)用者發(fā)送成功,并且將相關(guān)數(shù)據(jù)返回過去 如果發(fā)送網(wǎng)

    2024年01月21日
    瀏覽(17)
  • 【JavaScript】手寫Promise

    【JavaScript】手寫Promise

    ?? 個人主頁: 不叫貓先生 ???♂? 作者簡介:2022年度博客之星前端領(lǐng)域TOP 2,前端領(lǐng)域優(yōu)質(zhì)作者、阿里云專家博主,專注于前端各領(lǐng)域技術(shù),共同學(xué)習(xí)共同進步,一起加油呀! ??優(yōu)質(zhì)專欄:vue3從入門到精通、TypeScript從入門到實踐 ?? 資料領(lǐng)?。呵岸诉M階資料可以找我免

    2024年02月05日
    瀏覽(20)
  • 深入理解 JavaScript Promise

    深入理解 JavaScript Promise

    JavaScript中的Promise是一種處理異步操作的機制,它提供了一種優(yōu)雅的方式來處理回調(diào)函數(shù)地獄和異步代碼的流程控制。本文將深入介紹JavaScript中的Promise,幫助讀者更好地理解和應(yīng)用Promise。 Promise是一個代表異步操作的對象,它可以有三種狀態(tài):pending(進行中)、fulfilled(已

    2024年02月09日
    瀏覽(25)
  • JavaScript如何解決返回[object Promise]

    當(dāng)使用JavaScript中的Promise時,當(dāng)您嘗試訪問Promise的值時,您可能會看到返回值為 [object Promise] 的情況。這是因為Promise是一種異步操作,它不能立即返回結(jié)果,而是需要等待操作完成后返回結(jié)果。 要訪問Promise的值,您需要使用Promise的then()方法,該方法接受一個回調(diào)函數(shù)作為參

    2024年02月12日
    瀏覽(20)
  • [JavaScript理論學(xué)習(xí)] 什么是Promise (含如何判斷一個值是Promise)

    本文旨在對 Promise 的規(guī)范進行解釋, 便于讀者在學(xué)習(xí) Promise 的過程中梳理 Promise 之間的操作關(guān)系, 不對具體的代碼實現(xiàn)和Promise用法進行解釋. 比如, 為什么 [MDN-await] 中要提及一個 thenable 對象, 而且這個 thenable 對象 還可以和 Promise 實例 一樣使用 await 等待處理, 這就涉及到了下面

    2024年02月09日
    瀏覽(20)
  • Ajax_4(進階)同步異步+ 宏任務(wù)微任務(wù) + Promise鏈 + async終極解決方案 +事件循環(huán)原理 + 綜合案例

    01-同步代碼和異步代碼 什么是同步代碼? 同步代碼:逐行執(zhí)行,需要原地等待結(jié)果后,才繼續(xù)向下執(zhí)行。 什么是異步代碼? 調(diào)用后耗時,不阻塞代碼繼續(xù)執(zhí)行,(不必原地等待),在將來完成后 觸發(fā)一個 回調(diào)函數(shù) 。 代碼閱讀 目標(biāo):閱讀并回答代碼執(zhí)行和打印的順序 打印

    2024年02月13日
    瀏覽(51)
  • 深入學(xué)習(xí)JavaScript系列(七)——Promise async/await generator

    深入學(xué)習(xí)JavaScript系列(七)——Promise async/await generator

    本篇屬于本系列第七篇 第一篇:#深入學(xué)習(xí)JavaScript系列(一)—— ES6中的JS執(zhí)行上下文 第二篇:# 深入學(xué)習(xí)JavaScript系列(二)——作用域和作用域鏈 第三篇:# 深入學(xué)習(xí)JavaScript系列(三)——this 第四篇:# 深入學(xué)習(xí)JavaScript系列(四)——JS閉包 第五篇:# 深入學(xué)習(xí)JavaScrip

    2023年04月08日
    瀏覽(32)
  • 【前端異常】JavaScript錯誤處理:分析 Uncaught(in promise) error

    【前端異?!縅avaScript錯誤處理:分析 Uncaught(in promise) error

    在開發(fā)過程中,JavaScript的錯誤處理是一個老生常談的話題。當(dāng)應(yīng)用程序發(fā)生未捕獲的異常時,Uncaught(in promise) error是其中最常見的錯誤類型。這篇文章將從多個方面詳細闡述這種錯誤類型的原因與解決方案。 Promise是一種用于異步編程的原生JavaScript對象。它提供了一種處理異

    2024年02月05日
    瀏覽(102)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包