最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

NodeJS的Promise的用法解析

 更新時(shí)間:2016年05月05日 16:01:04   投稿:jingxian  
下面小編就為大家?guī)硪黄狽odeJS的Promise的用法解析。小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考

Javascript的特點(diǎn)是異步,Javascript不能等待,如果你實(shí)現(xiàn)某件需要等待的事情,你不能停在那里一直等待結(jié)果回來,相反,底線是使用回調(diào)callback:你定義一個(gè)函數(shù),這個(gè)函數(shù)只有等到結(jié)果可用時(shí)才能被調(diào)用。

這種回調(diào)模型對(duì)于好的代碼組織是沒有問題的,但是也可以通過從原始回調(diào)切換到promise解決很多問題,將promise看成是一個(gè)標(biāo)準(zhǔn)的數(shù)據(jù)容器,這樣會(huì)簡化你的代碼組織,可以成為基于promise的架構(gòu)。

什么是Promise?

一個(gè)promise是一個(gè)帶有".then()"方法的對(duì)象,其代表的是一個(gè)操作的結(jié)果可能還沒有或不知道,無論誰訪問這個(gè)對(duì)象,都能夠使用".then()"方法加入回調(diào)等待操作出現(xiàn)成功結(jié)果或失敗時(shí)的提醒通知,。

那么為什么這樣做好處優(yōu)于回調(diào)呢?標(biāo)準(zhǔn)的回調(diào)模式在我們處理請(qǐng)求時(shí)需要同時(shí)提供回調(diào)函數(shù):

request(url, function(error, response) { 

 // handle success or error.

});

doSomethingElse(); 

很不幸,這段代碼意味著這個(gè)request函數(shù)并不知道它自己什么時(shí)候能夠完成,當(dāng)然也沒有必要,我們最終通過回調(diào)傳遞結(jié)果。這會(huì)導(dǎo)致多個(gè)回調(diào)形成了嵌套回調(diào),或者稱為回調(diào)陷阱。

queryTheDatabase(query, function(error, result) { 

 request(url, function(error, response) {

  doSomethingElse(response, function(error, result) {

   doAnotherThing(result, function(error, result) {

    request(anotherUrl, function(error, response) {

     ...

    });

   });

  });

 });

});

Promise能夠解決這種問題,允許低層代碼創(chuàng)建一個(gè)request然后返回一個(gè)對(duì)象,其代表著未完成的操作,讓調(diào)用者去決定應(yīng)該加入什么回調(diào)。

Promise是什么?

promise是一個(gè)異步編程的抽象,它是一個(gè)返回值或拋出exception的代理對(duì)象,一般promise對(duì)象都有一個(gè)then方法,這個(gè)then方法是我們?nèi)绾潍@得返回值(成功實(shí)現(xiàn)承諾的結(jié)果值,稱為fulfillment)或拋出exception(拒絕承諾的理由,稱為rejection),then是用兩個(gè)可選的回調(diào)作為參數(shù),我們可以稱為onFulfilled和OnRejected:

var promise = doSomethingAync()
promise.then(onFulfilled, onRejected)

當(dāng)這個(gè)promise被解決了,也就是異步過程完成后,onFulfilled和OnRejected中任何一個(gè)將被調(diào)用,

因此,一個(gè)promise有下面三個(gè)不同狀態(tài):

■pending待承諾 - promise初始狀態(tài)
■fulfilled實(shí)現(xiàn)承諾 - 一個(gè)承諾成功實(shí)現(xiàn)狀態(tài)
■rejected拒絕承諾 - 一個(gè)承諾失敗的狀態(tài)

以讀取文件為案例,下面是使用回調(diào)實(shí)現(xiàn)讀取文件后應(yīng)該做什么事情(輸出打印):

readFile(function (err, data) {

 if (err) return console.error(err)

 console.log(data)

})

如果我們的readFile函數(shù)返回一個(gè)promise,那么我們可以如下實(shí)現(xiàn)同樣的邏輯(輸出打印):

var promise = readFile()
promise.then(console.log, console.error)

這里我們有了一個(gè)值promise代表的是異步操作,我們能夠一直傳遞這個(gè)值promise,任何人訪問這個(gè)值都能夠使用then來消費(fèi)使用它,無論這個(gè)值代表的異步操作是否完成或沒有完成,我們也能保證異步的結(jié)果不會(huì)改變,因?yàn)檫@個(gè)promise代表的異步操作只會(huì)執(zhí)行一次,狀態(tài)是要么fulfilled要么是rejected。

理解Promise

Promise可能是不同于日常直覺,為了理解它,一些重要原理必須記牢: .then()總是返回一個(gè)新的promise.,如下面代碼:

var promise = readFile()
var promise2 = promise.then(readAnotherFile, console.error)

這里then的參數(shù)readAnotherFile, console.error是代表異步操作成功后的動(dòng)作onFulfilled或失敗后的動(dòng)作OnRejected,也就是說,讀取文件成功后執(zhí)行readAnotherFile函數(shù),否則失敗打印記錄錯(cuò)誤。這種實(shí)現(xiàn)是兩個(gè)中只有一種可能。

我們?cè)倏聪旅嫔鲜龃a如下:

var promise = readFile()

var promise2 = promise.then(function (data) {

 return readAnotherFile() // 如果readFile成功,執(zhí)行readAnotherFile

}, function (err) {

 console.error(err) // 如果readFile不成功,記錄,但是還是執(zhí)行readAnotherFile

 return readAnotherFile()

})

promise2.then(console.log, console.error) // readAnotherFile函數(shù)的執(zhí)行結(jié)果

因?yàn)閠hen返回一個(gè)promise,它意味著promise能夠被chain串行鏈條花,這樣能避免回調(diào)地獄:

readFile()

 .then(readAnotherFile)

 .then(doSomethingElse)

 .then(...)

Promise法則有兩部分必須分離:

(1).then()總是返回一個(gè)新的promise,每次你調(diào)用它,它不管回調(diào)做什么,因?yàn)?then()在回調(diào)被調(diào)用之前已經(jīng)給了你一個(gè)承諾promise,回調(diào)的行為只影響承諾promise的實(shí)施,如果回調(diào)返回一個(gè)值,那么promise將使用那個(gè)值,如果這個(gè)值是一個(gè)promise,返回這個(gè)promise實(shí)施后的值給這個(gè)值,如果回調(diào)拋出錯(cuò)誤,promise將拒絕錯(cuò)誤。

(2)被.then()返回的promise是一個(gè)新的promise,它不同于那些.then()被調(diào)用的promise,promise長長的鏈條有時(shí)會(huì)好些隱藏這個(gè)事實(shí),不管如何,每次.then()調(diào)用都會(huì)產(chǎn)生一個(gè)新的promise,這里必須注意的是你真正需要考慮的是你最后調(diào)用.then()可能代表失敗,那么如果你不捕獲這種失敗,那么容易導(dǎo)致你的錯(cuò)誤exception消失。

一些人認(rèn)為.then()串聯(lián)鏈條調(diào)用很類似fluent風(fēng)格,但是長長的promise鏈條會(huì)讓人迷惑,最后切分為一個(gè)個(gè)有意義的函數(shù):

function getTasks() { 

 return $http.get('http://example.com/api/v1/tasks')

  .then(function(response) {

   return response.data;

  });

}

 

function getMyTasks() { 

 return getTasks()

  .then(function(tasks) {

   return filterTasks(tasks, {

    owner: user.username

   });

  });

}

在這個(gè)例子中,兩個(gè)函數(shù)各自獲得一個(gè)promise,攜帶了一個(gè)回調(diào)函數(shù)。

有趣的Promise

同樣的promise能夠接受任何數(shù)目的回調(diào),當(dāng)一個(gè)Promise被解決實(shí)施后,其中所有回調(diào)函數(shù)都會(huì)被調(diào)用,此外,一個(gè)promise在被解決實(shí)施后,甚至可以接受一個(gè)新的回調(diào),這些回調(diào)完成能以正常方式被調(diào)用,這就允許我們使用回調(diào)實(shí)現(xiàn)簡單形式的緩存:

var tasksPromise; 

function getTasks() { 

 taskPromise = taskPromise || getTasksFromTheServer();

 return taskPromise;

}

這個(gè)案例中,getTasks()函數(shù)可以被任意次數(shù)調(diào)用,它總是返回銅牙的promise,其中函數(shù)getTasksFromTheServer()卻只是被調(diào)用一次。

以上這篇NodeJS的Promise的用法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • el-date-picker 如何限制選擇六個(gè)月內(nèi)的日期

    el-date-picker 如何限制選擇六個(gè)月內(nèi)的日期

    這篇文章主要介紹了el-date-picker 如何限制選擇六個(gè)月內(nèi)的日期,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧
    2024-07-07
  • 使用CSS3的scale實(shí)現(xiàn)網(wǎng)頁整體縮放

    使用CSS3的scale實(shí)現(xiàn)網(wǎng)頁整體縮放

    QQ郵箱的網(wǎng)頁整體縮放效果,原來實(shí)現(xiàn)方法如此簡單,下面有個(gè)實(shí)現(xiàn)示例,大家可以參考下
    2014-03-03
  • 用JavaScript獲取頁面文檔內(nèi)容的實(shí)現(xiàn)代碼

    用JavaScript獲取頁面文檔內(nèi)容的實(shí)現(xiàn)代碼

    下面小編就為大家?guī)硪黄肑avaScript獲取頁面文檔內(nèi)容的實(shí)現(xiàn)代碼。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-06-06
  • JS組件Bootstrap Select2使用方法詳解

    JS組件Bootstrap Select2使用方法詳解

    這篇文章主要為大家介紹了JS組件Bootstrap Select2使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • canvas實(shí)現(xiàn)環(huán)形進(jìn)度條效果

    canvas實(shí)現(xiàn)環(huán)形進(jìn)度條效果

    本文主要介紹了canvas實(shí)現(xiàn)環(huán)形進(jìn)度條效果的實(shí)例。具有很好的參考價(jià)值。下面跟著小編一起來看下吧
    2017-03-03
  • javascript實(shí)現(xiàn)搶購倒計(jì)時(shí)程序

    javascript實(shí)現(xiàn)搶購倒計(jì)時(shí)程序

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)搶購倒計(jì)時(shí)程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • FileUpload上傳圖片(圖片不變形)

    FileUpload上傳圖片(圖片不變形)

    FileUpload上傳圖片(圖片不變形) 的實(shí)現(xiàn)方法,需要的朋友可以參考下。
    2010-08-08
  • 基于js?+?html2canvas實(shí)現(xiàn)網(wǎng)頁放大鏡功能

    基于js?+?html2canvas實(shí)現(xiàn)網(wǎng)頁放大鏡功能

    最近接到任務(wù),需實(shí)現(xiàn)【網(wǎng)頁】放大鏡的效果,百度搜索?【js?放大鏡】關(guān)鍵字,千篇一律的都是一些仿淘寶/京東等電商網(wǎng)站中查看規(guī)格大圖的效果實(shí)現(xiàn),根本無法滿足我的需求,于是自己花了點(diǎn)時(shí)間調(diào)研實(shí)現(xiàn),在這里分享給大家,感興趣的朋友可以參考下
    2023-12-12
  • RxJS在TypeScript中的簡單使用詳解

    RxJS在TypeScript中的簡單使用詳解

    這篇文章主要介紹了RxJS在TypeScript中的簡單使用詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 取得元素的左和上偏移量的方法

    取得元素的左和上偏移量的方法

    利用offsetParent屬性在Dom層次中逐級(jí)向上回溯,將每個(gè)層次偏移量合計(jì),需要的朋友可以參考下
    2014-09-09

最新評(píng)論

清远市| 蛟河市| 岳阳县| 贵南县| 微山县| 监利县| 宁乡县| 新乡市| 沁阳市| 商城县| 滨海县| 涿州市| 静海县| 离岛区| 克什克腾旗| 长治市| 沈阳市| 务川| 东乌珠穆沁旗| 子洲县| 三亚市| 宁波市| 房产| 永平县| 廉江市| 和平县| 庄河市| 措勤县| 玉山县| 香河县| 东源县| 辽宁省| 金川县| 出国| 兴业县| 镇雄县| 辽阳市| 凤山县| 藁城市| 江山市| 汉寿县|