成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

前端異步解決方案-3(Promise)

genedna / 2911人閱讀

摘要:又有好些天沒有動(dòng)筆了,這幾天一直在斷斷續(xù)續(xù)的學(xué)習(xí)和,今天終于能夠把著兩個(gè)玩意結(jié)合起來(lái)了解決異步問(wèn)題了。今天我先把相關(guān)的用法和對(duì)異步的處理分享給大家。老樣子,還是先模擬一個(gè)。

又有好些天沒有動(dòng)筆了,這幾天一直在斷斷續(xù)續(xù)的學(xué)習(xí)Promise和generator,今天終于能夠把著兩個(gè)玩意結(jié)合起來(lái)了解決異步問(wèn)題了。今天我先把promise相關(guān)的用法和對(duì)異步的處理分享給大家。
老樣子,還是先模擬一個(gè)Promise。

//咳咳這樣就實(shí)現(xiàn)了嘛
let MyPromise = Promise;

開個(gè)玩笑,其實(shí)這兩天我也一直在看Promise的實(shí)現(xiàn),但是還是沒有怎么理解。所以Promise的代碼實(shí)現(xiàn)我暫時(shí)先放一放,等我完全理解再來(lái)新開一篇分享。這里先給大家推薦幾篇我覺得比較好的Promise實(shí)現(xiàn)的博客,想要學(xué)習(xí)的小伙伴可以先到那邊一睹為快,當(dāng)然等我更新了之后大家還是要來(lái)給我文章點(diǎn)贊的哈。
徹底理解Promise對(duì)象——用es5語(yǔ)法實(shí)現(xiàn)一個(gè)自己的Promise(上篇)這一篇文章用的es5的語(yǔ)法,對(duì)es6不是很熟悉的同學(xué)可以用這篇文章頂一下
Promise實(shí)現(xiàn)原理(附源碼)這一篇呢是用到了class的,所以需要大家對(duì)es6有所了解,也是一篇好文章

接下來(lái)我介紹一下Promise最常用的幾個(gè)部分:

首先先介紹最簡(jiǎn)單的只有一個(gè)Promise對(duì)象的用法

//Promise()接收一個(gè)函數(shù),并且在創(chuàng)建這個(gè)Promise對(duì)象的同時(shí),接收的這個(gè)函數(shù)就會(huì)被立刻執(zhí)行
var promise = new Promise(function (resolve, reject) {
  //resolve用來(lái)接收成功的返回,reject用來(lái)接收失敗的返回
  setTimeout(function () {
    //這里我們生成一個(gè)隨機(jī)數(shù),并在接下來(lái)根據(jù)這個(gè)隨機(jī)數(shù)的大小來(lái)判斷這個(gè)異步是否成功
    let num = Math.random();
    if (num  > 0.8) {
      //接收失敗的原因
      console.log("reject")
      reject(num + "大于0.8,這次異步操作失敗了")
    } else {
      //接收成功的數(shù)據(jù)
      console.log("resolve")
      resolve(num + "小于0.8,這次異步操作成功了")
    }
  }, 100)
});
console.log("一個(gè)Promise對(duì)象生成了");
//Promise對(duì)象的.then()方法接收兩個(gè)回調(diào),第一個(gè)為成功回調(diào),第二個(gè)為失敗回調(diào)
//這兩個(gè)回調(diào)會(huì)在上面的resolve或者reject函數(shù)生效后被調(diào)用
promise.then(function (data) {
  //這個(gè)函數(shù)會(huì)在上面的resolve函數(shù)被調(diào)用后生效,這里的data就是上面resolve()中接收的值
  console.log(data)
}, function (err) {
  ///這個(gè)函數(shù)會(huì)在上面的reject函數(shù)被調(diào)用后生效,這里的err就是上面reject()中接收的值
  console.error(err)
});
console.log("promise的.then方法被調(diào)用了")

大家可以按F12喚起控制臺(tái),然后把這段代碼運(yùn)行幾次??纯磿?huì)有什么結(jié)果;
多運(yùn)行幾次以后,大家應(yīng)該可以看到這兩類結(jié)果:


其中的undefind是console.log("promise的.then方法被調(diào)用了")這行代碼的返回,大家可以不用關(guān)注。在這里可以看到不論是成功的結(jié)果還是失敗的結(jié)果都是在定時(shí)器執(zhí)行后再打印出來(lái)的。這種寫法可以幫助我們實(shí)現(xiàn)簡(jiǎn)單的異步編程。

接下介紹多個(gè)Promise對(duì)象同時(shí)使用的用法, 先介紹最常見的.then()鏈?zhǔn)秸{(diào)用的方法

 //用來(lái)快速生成一個(gè)Promise對(duì)象,接收一個(gè)日志列表,不論成功還是失敗都會(huì)往日志列表中添加一條日志
 function promise(log) {
   return new Promise(function (resolve, reject) {
     setTimeout(function () {
       log = log || [];
       //和上次的例子一樣,利用隨機(jī)數(shù)來(lái)隨機(jī)失敗和成功
       let num = Math.random();
       if (num > 0.5) {
         log.push(num + "大于0.5,這次異步操作失敗了");
         reject(log)
       } else {
         log.push(num + "小于0.5,這次異步操作成功了");
         resolve(log)
       }
     }, 100)
   })
 }

.then()中返回了Promise對(duì)象的情況

var promise1 = promise();
//promise1.then()方法會(huì)返回一個(gè)Promise對(duì)象
//如果我們?cè)?then()生效的那個(gè) !!!回調(diào)方法!!! 中有返回一個(gè)Promise對(duì)象的話,該對(duì)象會(huì)被  !!!.then()方法!!!  返回

//先看返回了Promise對(duì)象的方式
promise1.then(function (data) {
  console.log(data);
  return promise(data)
}, function (err) {
  console.error(err);
  return promise(err)
}).then(function (data) {
  console.log(data)
}, function (err) {
  console.error(err)
});

這段代碼運(yùn)行后一共會(huì)有四種結(jié)果:
兩次都成功

兩次都失敗

第一次失敗,第二次成功

第一次成功,第二次失敗

通過(guò)這種方法我們可以用比較清晰的方式來(lái)書寫我們的異步代碼。特別是多個(gè)異步操作嵌套的時(shí)候,可以鏈?zhǔn)秸{(diào)用.then()來(lái)實(shí)現(xiàn),這樣的代碼看起來(lái)邏輯更清晰;
剛剛看完了返回了Promise對(duì)象的場(chǎng)景,再來(lái)看看沒有返回Promise的場(chǎng)景

//如果我們沒有返回Promise對(duì)象,.then()就會(huì)將我們返回的東西包裝成一個(gè)Promise對(duì)象(沒有返回就相當(dāng)于返回了undefined)
//可以等同于我們寫了 return new Promise((resolve,reject)=>{resolve(/*原先的返回值*/)})
promise1.then(function (data) {
  console.log(data);
  return data;
}, function (err) {
  console.error(err);
  return err;
}).then(function (data) {
  console.log(data)
}, function (err) {
  //這里是永遠(yuǎn)不會(huì)被觸發(fā)的,原因是上一個(gè).then() 返回的是new Promise((resolve,reject)=>{resolve(/*原先的返回值*/)})
  //返回的Promise對(duì)象的reject方法永遠(yuǎn)都不會(huì)被觸發(fā),所以這個(gè)里也就永遠(yuǎn)都不會(huì)觸發(fā)了
  console.error(err)
});

講解都寫在注釋里面了,接下里我就貼運(yùn)行圖吧,這段代碼會(huì)運(yùn)行出以下兩類結(jié)果:

需要所有的請(qǐng)求都返回后才可以執(zhí)行某個(gè)動(dòng)作

//改造promise,讓其可以接收一個(gè)定時(shí)器等待時(shí)間參數(shù)
function promise(log, time) {
  return new Promise(function (resolve, reject) {
    setTimeout(function () {
      log = log || [];
      //和上次的例子一樣,利用隨機(jī)數(shù)來(lái)隨機(jī)失敗和成功
      let num = Math.random();
      if (num > 0.5) {
        log.push("等待時(shí)長(zhǎng)" + time + "," + num + "大于0.5,這次異步操作失敗了");
        console.error(log);
        reject(log)
      } else {
        log.push("等待時(shí)長(zhǎng)" + time + "," + num + "小于0.5,這次異步操作成功了");
        console.log(log);
        resolve(log)
      }
    }, time)
  })
}
//Promise.all()可以接收一個(gè)Promise對(duì)象的數(shù)組,返回一個(gè)Promise對(duì)象
//該P(yáng)romise對(duì)象會(huì)在數(shù)組中所有Promise成功返回后執(zhí)行成功回調(diào),在任意一個(gè)Promise失敗后立刻執(zhí)行失敗回調(diào)
var promise1 = promise(null, 10), promise2 = promise(null, 100),
  promise3 = Promise.all([promise1, promise2]);
promise3.then((data) => {
  //這里的data為promise1,和promise2的返回值的數(shù)組
  console.log("promise3", data)
}, (err, err2) => {
  //報(bào)錯(cuò)信息
  console.error("promise3", err)
});

這段代碼一共有四種可能的結(jié)果
如果兩次都成功的話

如果兩次都成的話,promise3會(huì)執(zhí)行成功回調(diào),并且回調(diào)中的data就是promise1和promise2返回值的數(shù)組(數(shù)組順序和.all()中的順序一致)



任意一個(gè)promise失敗的話,promise3會(huì)立刻執(zhí)行失敗回調(diào),并且回調(diào)中的err就是失敗的那個(gè)promise在reject中返回的值

文章寫到這里,我認(rèn)為Promise常用的一些用法都已經(jīng)講完了,更詳細(xì)的Promise的教程請(qǐng)參考 MDN中對(duì)promise的講解

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/103568.html

相關(guān)文章

  • 前端原理_異步與單線程

    摘要:?jiǎn)尉€程什么是單線程語(yǔ)言的執(zhí)行環(huán)境是單線程所謂單線程,就是指一次只能完成一件任務(wù)。如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 單線程 什么是單線程? Javascript語(yǔ)言的執(zhí)行環(huán)境是單線程(single thread) 所謂單線程,就是指一次只能完成一件任務(wù)。 如果有多個(gè)任務(wù),就必須排隊(duì),前面一個(gè)任務(wù)完成,再執(zhí)行后面一個(gè)任務(wù),以此類推。 執(zhí)行JS代...

    NoraXie 評(píng)論0 收藏0
  • 前端面試題 -- JavaScript(二)

    摘要:拋出的錯(cuò)誤對(duì)象會(huì)被方法回調(diào)函數(shù)接收到命令命令后面是一個(gè)對(duì)象,返回該對(duì)象的結(jié)果。有人將其稱之為宏任務(wù)微任務(wù),定時(shí)器就屬于宏任務(wù)的范疇。 前言 上一篇 前端面試題-JavaScript(一), 感興趣的小伙伴也可以移步這里查看 完整版JavaScript面試題,面試題會(huì)不定期更新加進(jìn)去一些個(gè)人工作中遇到的或者認(rèn)為比較重要的東西,后面會(huì)涉及到前端的各個(gè)方面,感興趣的小伙伴可以關(guān)注哦! 如果文...

    cgspine 評(píng)論0 收藏0
  • 高級(jí)前端面試題大匯總(只有試題,沒有答案)

    摘要:面試題來(lái)源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。 面試題來(lái)源于網(wǎng)絡(luò),看一下高級(jí)前端的面試題,可以知道自己和高級(jí)前端的差距。有些面試題會(huì)重復(fù)。 使用過(guò)的koa2中間件 koa-body原理 介紹自己寫過(guò)的中間件 有沒有涉及到Cluster 介紹pm2 master掛了的話pm2怎么處理 如何和MySQL進(jìn)行通信 React聲明周期及自己的理解 如何...

    kviccn 評(píng)論0 收藏0
  • ES6-7

    摘要:的翻譯文檔由的維護(hù)很多人說(shuō),阮老師已經(jīng)有一本關(guān)于的書了入門,覺得看看這本書就足夠了。前端的異步解決方案之和異步編程模式在前端開發(fā)過(guò)程中,顯得越來(lái)越重要。為了讓編程更美好,我們就需要引入來(lái)降低異步編程的復(fù)雜性。 JavaScript Promise 迷你書(中文版) 超詳細(xì)介紹promise的gitbook,看完再不會(huì)promise...... 本書的目的是以目前還在制定中的ECMASc...

    mudiyouyou 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<