亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

實(shí)現(xiàn) JavaScript 異步方法 Promise.all

mushang / 746人閱讀

摘要:本次的任務(wù)假如。。。。。引擎發(fā)生了重大故障,方法變成了,為了拯救世界,需要開發(fā)一個(gè)模塊來解決此問題。實(shí)現(xiàn)首先要知道是什么是對(duì)異步編程的一種抽象。數(shù)組中任何一個(gè)為的話,則整個(gè)調(diào)用會(huì)立即終止,并返回一個(gè)的新的對(duì)象。

本次的任務(wù)

假如。。。。。

JavaScript v8 引擎發(fā)生了重大故障,Promise.all 方法變成了 undefined ,為了拯救 JavaScript 世界,需要開發(fā)一個(gè)模塊來解決此問題。

使用者需要在代碼入口處引入我們開發(fā)的模塊就可渡過此劫,但要求三個(gè)月后官方修改此版本,代碼無修改就能自動(dòng)切換到官方版本。實(shí)現(xiàn) Promise.all

首先要知道 Promise 是什么

promise 是對(duì)異步編程的一種抽象。它是一個(gè)代理對(duì)象,代表一個(gè)必須進(jìn)行異步處理的函數(shù)返回的值或拋出的異常。

promise 最早是在 commonjs 社區(qū)提出來的,當(dāng)時(shí)提出了很多規(guī)范。比較接受的是 promise/A 規(guī)范。后來人們?cè)谶@個(gè)基礎(chǔ)上。提出了 promise/A+規(guī)范,也就是實(shí)際上的業(yè)內(nèi)推行的規(guī)范。ECMAScript 6.0 也是采用的這種規(guī)范。

英文版:https://promisesaplus.com/

中文版:【翻譯】Promises/A+規(guī)范

上面的規(guī)范中主要定義的 then 的實(shí)現(xiàn)方式,也就是只規(guī)定了 Promise 的核心, Promise.racePromise.allapi 沒有規(guī)定。

ECMAScript 6.0 Promise.all 規(guī)范

Node.js 兼容性如下圖 點(diǎn)擊查看在線版

特點(diǎn)

Promise 不需要編譯器/解釋器的支持

將來可能成為主流的 async-await,以及曾經(jīng)火過一把的 generator + co,這些都是需要編譯器或者解釋器級(jí)別的支持才能使用。

Promise,是完全可以利用語言已有特性,作為一個(gè)庫來實(shí)現(xiàn)!即使在非常原始的JS運(yùn)行環(huán)境,你也可以自己實(shí)現(xiàn)一個(gè) Promise,而不需要等待其他人的幫助。

Promise 是語言無關(guān)的

Promise 還是獨(dú)立于語言的,如果你要給另外一種編程語言實(shí)現(xiàn) Promise,只要照葫蘆畫瓢就行了。

promise 怎么用

請(qǐng)看這里,阮一峰的 ECMAScript 6 入門 Promise

實(shí)現(xiàn) Promise.all

Promise.all 接收一個(gè) promise 對(duì)象的數(shù)組作為參數(shù),當(dāng)這個(gè)數(shù)組里的所有 promise 對(duì)象全部變?yōu)?b>resolve或 有 reject 狀態(tài)出現(xiàn)的時(shí)候,它才會(huì)去調(diào)用 .then 方法,它們是并發(fā)執(zhí)行的。

Promise.all 簡介

Promise.all(promiseArray) 方法是 Promise 對(duì)象上的靜態(tài)方法,該方法的作用是將多個(gè) Promise 對(duì)象實(shí)例包裝,生成并返回一個(gè)新的 Promise 實(shí)例。

參數(shù):promiseArray,是一個(gè) Promise 實(shí)例數(shù)組

var p1 = Promise.resolve(1),
    p2 = Promise.resolve(2),
    p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    console.log(results);  // [1, 2, 3]
});

在上面的方法中,promise 數(shù)組中所有的 promise 實(shí)例都變?yōu)?b>resolve 的時(shí)候,該方法才會(huì)返回,并將所有結(jié)果傳遞 results 數(shù)組中。promise 數(shù)組中任何一個(gè) promisereject 的話,則整個(gè) Promise.all 調(diào)用會(huì)立即終止,并返回一個(gè) reject 的新的 promise 對(duì)象。reject 使用示例如下:

var p1 = Promise.resolve(1),
    p2 = Promise.reject(2),
    p3 = Promise.resolve(3);
Promise.all([p1, p2, p3]).then(function (results) {
    //then方法不會(huì)被執(zhí)行
    console.log(results);
}).catch(function (e){
    //catch方法將會(huì)被執(zhí)行,輸出結(jié)果為:2
    console.log(2);
});
總結(jié) promise.all 的特點(diǎn)

1、接收一個(gè) Promise 實(shí)例的數(shù)組或具有 Iterator 接口的對(duì)象,

2、如果元素不是 Promise 對(duì)象,則使用 Promise.resolve 轉(zhuǎn)成 Promise 對(duì)象

3、如果全部成功,狀態(tài)變?yōu)?resolved,返回值將組成一個(gè)數(shù)組傳給回調(diào)

4、只要有一個(gè)失敗,狀態(tài)就變?yōu)?rejected,返回值將直接傳遞給回調(diào)
all() 的返回值也是新的 Promise 對(duì)象

實(shí)現(xiàn) Promise.all 方法
function promiseAll(promises) {
  return new Promise(function(resolve, reject) {
    if (!isArray(promises)) {
      return reject(new TypeError("arguments must be an array"));
    }
    var resolvedCounter = 0;
    var promiseNum = promises.length;
    var resolvedValues = new Array(promiseNum);
    for (var i = 0; i < promiseNum; i++) {
      (function(i) {
        Promise.resolve(promises[i]).then(function(value) {
          resolvedCounter++
          resolvedValues[i] = value
          if (resolvedCounter == promiseNum) {
            return resolve(resolvedValues)
          }
        }, function(reason) {
          return reject(reason)
        })
      })(i)
    }
  })
}

npms 地址 promise-all-simple

參考

自己動(dòng)手實(shí)現(xiàn)ES6 Promise

JavaScript Promise迷你書

Promise對(duì)象Promise.all()方法的使用

深入 Promise(一)——Promise 實(shí)現(xiàn)詳解

深入理解 Promise (上)

擴(kuò)展閱讀

深入淺出js(Node.js)異步流程控制

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

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

相關(guān)文章

  • javascript異步Promise.all()、Promise.race()、Promise.

    摘要:的執(zhí)行與狀態(tài)無關(guān)當(dāng)?shù)玫綘顟B(tài)不論成功或失敗后就會(huì)執(zhí)行,原文鏈接參考鏈接對(duì)象 同期異步系列文章推薦談一談javascript異步j(luò)avascript異步中的回調(diào)javascript異步與promisejavascript異步之Promise.resolve()、Promise.reject()javascript異步之Promise then和catchjavascript異步之a(chǎn)sync...

    clasnake 評(píng)論0 收藏0
  • 現(xiàn)代JS中的流程控制:詳解Callbacks 、Promises 、Async/Await

    摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡化異步編碼旅程異步編程是一項(xiàng)在中無法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語言都處理每...

    shadowbook 評(píng)論0 收藏0
  • 現(xiàn)代JS中的流程控制:詳解Callbacks 、Promises 、Async/Await

    摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡化異步編碼旅程異步編程是一項(xiàng)在中無法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語言都處理每...

    oujie 評(píng)論0 收藏0
  • 現(xiàn)代JS中的流程控制:詳解Callbacks 、Promises 、Async/Await

    摘要:控制臺(tái)將顯示回調(diào)地獄通常,回調(diào)只能由一個(gè)異步函數(shù)調(diào)用。更多資源使更友好規(guī)范使用異步函數(shù)簡化異步編碼旅程異步編程是一項(xiàng)在中無法避免的挑戰(zhàn)。 JavaScript經(jīng)常聲稱是_異步_。那是什么意思?它如何影響發(fā)展?近年來這種方法有何變化? 請(qǐng)思考以下代碼: result1 = doSomething1(); result2 = doSomething2(result1); 大多數(shù)語言都處理每...

    anquan 評(píng)論0 收藏0
  • JavaScript Promise啟示錄

    摘要:近幾年隨著開發(fā)模式的逐漸成熟,規(guī)范順勢而生,其中就包括提出了規(guī)范,完全改變了異步編程的寫法,讓異步編程變得十分的易于理解。最后,是如此的優(yōu)雅但也只是解決了回調(diào)的深層嵌套的問題,真正簡化異步編程的還是,在端,建議考慮。 本篇,簡單實(shí)現(xiàn)一個(gè)promise,主要普及promise的用法。 一直以來,JavaScript處理異步都是以callback的方式,在前端開發(fā)領(lǐng)域callback機(jī)制...

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

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

0條評(píng)論

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