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

資訊專欄INFORMATION COLUMN

這樣理解 promise

liangzai_cool / 1749人閱讀

摘要:函數會在異步操作成功完成時被調用,并將異步操作的返回值作為參數傳遞到外部。方法的返回值方法總是返回一個新的對象,多次調用方法,默認返回一個一個空的對象使用來來返回。

promise是什么

官網解釋 promise 表示一個異步操作的最終結果。

翻譯 ==可以將promise理解為一個狀態(tài)機==,它存在三種不同的狀態(tài),并在某一時刻只能有一種狀態(tài)

pending 表示還在執(zhí)行

resolved 執(zhí)行成功

rejected 執(zhí)行失敗

一個promise是對一個異步操作的封裝,異步操作有等待完成、成功和失敗三種可能的結果,對應了promise的三種狀態(tài)。

promise的狀態(tài)只能有pending轉換位resolved或者pending轉換為rejected,一旦狀態(tài)轉化完成就無法再改變。

假設我們用promise封了一個異步操作,那么當它被創(chuàng)建的時候就處于pending狀態(tài),當異步操作成功完成時,
我們將狀態(tài)轉換為resolved,如果執(zhí)行中出現錯誤,將狀態(tài)轉換為rejected。

var promise=new Promise(function(resolve,reject){
  // code
  if(){
    /*異步操作成功 */
    resolve(value)
  }else{
    reject(error)
  }
})
使用then方法獲取結果
var fs=require("fs")
function readFile_promise(path){
  return new Promise(function(resolve,reject){
    fs.readFile(path, "utf-8",function(err,data){
      if(data){
        resolve(data)
      }else{
        reject(err)
      }
    })
  })
}

var result=readFile_promise("./1.txt")
result.then(function(value){
  //success
  console.log("success", value)
},function(error){
  //failure
  console.log("failure",error)
})
// 將一個異步函數封裝成promise,只要在回調函數中針對不同的返回結果調用resolve或者reject方法。

// resolve函數會在異步操作成功完成時被調用,并將異步操作的返回值作為參數傳遞到外部。
// reject是在異步操作出現異常時被調用,會將錯誤信息作為參數傳遞出去。
then方法的返回值

then方法總是返回一個新的promise對象,多次調用then方法,默認返回一個一個空的promise對象
使用return來來返回。

var promise=readFile_promise("./foo.txt")
promise.then(function(value){
  //success
  console.log("success", value) // foo
  return readFile_promise("./bar.txt")
},function(error){
  //failure
  console.log("failure",error)
}).then(function(value){
  console.log("then", value) // bar
})
promise的執(zhí)行

雖然我們是通過then方法來獲取promise的結果,但是promise是當then方法調用之后才執(zhí)行嗎?

var promise=new Promise((resolve, reject)=>{
  console.log("begin")
  resolve()
})

setTimeout(()=>{
  promise.then(()=>{
    console.log("end")
  })
},5000)
// 開始begin 5s后end
// 運行順序是,當promise從被創(chuàng)建的那一刻起就開始執(zhí)行了,then方法只是提供了訪問promise狀態(tài)的接口,與promise的執(zhí)行無關。
promise 常用的api

resolved

rejected

all

race 方法接收一個promise數組作為參數并返回一個新的promise,數組中的promise會同時開始執(zhí)行,race返回的promise的狀態(tài)有數組中率先執(zhí)行完畢的promise的狀態(tài)決定

catch 執(zhí)行出錯可以使用throw關鍵字拋出錯誤,并使用catch方法進行捕獲

 // 如果有多個promise需要執(zhí)行,可以使用promise.all()
// 方法統(tǒng)一聲明,改方法可以將多個promise對象包裝成一個promise
// 該方法接收一個數組作為參數,數據的元素如果不是promise對象,則回先調用resolve方法轉換。
//  如果中間有一個promise狀態(tài)是reject,那么轉換后的promise也會變成reject,并且將錯誤信息傳給catch方法
var promises=["foo.txt","bar.txt","baz.txt"]
promises.map(function(path){
  // console.log(path)
  return readFile_promise(path)
})

Promise.all(promises).then(function(results){
  console.log(results) // [ "foo.txt", "bar.txt", "baz.txt" ] 順序排列的
}).catch(function(err){
  // 
})
使用promise組織異步代碼
// 例子; 有三個文本文件需要順序讀取
var lists=["foo.txt","bar.txt","baz.txt"]
var count=0;
readFile_promise("foo.txt").then(readCB).then(readCB).then(readCB);

function readCB(data){
  console.log(data) // foo bar baz
  if(++count>2){
    return
  }
  return readFile_promise(lists[count])
}
async/await

await關鍵字后面往往是一個promise,如果不是就隱式調用promise.resolve來轉換成一個promise。
await 等待后面的promise執(zhí)行完成再進行下一步操作。

var asyncReadFile=async function(){
  var result1=await readFile_promise("./foo.txt")
  console.log(result1.toString()) // foo
}
asyncReadFile()
async返回值

async函數總是會返回一個promise對象,如果return關鍵字后面不是一個promise,那么默認
調用promise。resolve方法進行轉換。

async function asyncFunc(){
  return "hello Node"
}
asyncFunc().then(function(data){
  console.log(data) // hello Node
})
async函數的執(zhí)行過程

在async函數開始執(zhí)行的時候回自動生成一個promise對象。

當方法體開始執(zhí)行后,如果遇到return關鍵字或者throw關鍵字,執(zhí)行會立刻退出,

如果遇到await關鍵字則回暫停執(zhí)行 await后面的異步操作結束后會恢復執(zhí)行

執(zhí)行完畢,返回一個promise

async function asyncFunc(){
  console.log("begin")
  return "hello Node"
}
asyncFunc().then(function(data){
  console.log(data) // hello Node
  console.log("end")
})
// begin 
// hello 
// end
await

await 操作符的結果是由其后面promise對象的操作結果來決定的,如果后面promise對象變?yōu)閞esolved,
await操作符發(fā)返回的值就是resolve的值;如果promise對象的狀態(tài)變成rejected,那么await也會拋出reject的值。

async function readFile(){
  var result=await readFile_promise("./foo.txt")
  console.log(result) // foo
}
readFile()

// 等價于
readFile_promise("foo.txt").then(function(data){
  console.log(data) // foo
})
await于并行

await會等待后面的promise完成后再采取下一步動作,這意味著當多個await操作時,程序會便成完全的
串行操作。

當異步操作之間不存在依賴關系時,可以使用promise.all來實現并行。

async function readFile(){
  const [result1, result2]=await Promise.all([
    readFile_promise("./foo.txt"),
    readFile_promise("./bar.txt")
  ])
  console.log(result1, result2) // foo bar
}
readFile()

// 等價于
function readFile(){
  return Promise.all([
    readFile_promise("./foo.txt"),
    readFile_promise("./baz.txt")
  ]).then((result)=>{
    console.log(result) // [ "foo", "baz" ]
  })
}
readFile()
await 總結
await關鍵字使用的一些關鍵點

await關鍵字必須位于async函數內部

await關鍵字后面需要是一個promise對象(不是的話就調用了resolve轉換的)

await關鍵字的返回結果就是在其后面promise執(zhí)行的結果,可能是resolved或者rejected的值

不能在普通箭頭函數中使用await關鍵字,需要在箭頭函數前面加上async關鍵字。

await用來串行地執(zhí)行異步操作,想實現并行使用promise.all

async函數 的缺點

假設我們有很多層的方法調用,最底層的異步操作被封裝成了async方法,那么該函數的所有上層方法可能都要變成async方法。

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

轉載請注明本文地址:http://www.ezyhdfw.cn/yun/102879.html

相關文章

  • 深入理解 Promise 實現細節(jié)

    摘要:顯然,了解的實現細節(jié),可以幫助我們更好地應用它。本文將主要根據的這篇文章,探討的實現細節(jié)。核心說明盡管已經有自己的規(guī)范,但目前的各類庫,在的實現細節(jié)上是有差異的,部分甚至在意義上完全不同。到前面到為止,所實現的都是不能級聯的。 在之前的異步JavaScript與Promise一文中,我介紹了Promise以及它在異步JavaScript中的使用意義。一般來說,我們是通過各種JavaSc...

    junbaor 評論0 收藏0
  • 對于`Promise`部分屬性的理解

    摘要:對于和的理解今天碰到問題是這樣子的調試的時候發(fā)現走了也走了有在我印象里是走了就不該走后來發(fā)現是我理解錯了代碼是這樣的這個的是里的異常,里如果有任何異常都會被捕獲仔細看了是這樣解釋的簡單來講調用等于調用由于返回的是一個對象,返回值解釋如下如果 對于Promise.then()和Promise.catch()的理解 今天碰到問題是這樣子的:調試bug的時候發(fā)現axios走了then也走了有...

    ?。?。 評論0 收藏0
  • 【譯】理解回調和Promise

    摘要:理解回調和原文自工程師博客,傳送門這兩個概念是編程語言的基本內容?;卣{地獄就是濫用回調。通常,在回調中,錯誤作為第一個參數傳遞。這個具有這兩個函數作為參數的回調稱為執(zhí)行程序。到目前為止,我希望我已經讓自己了解了回調和。 理解回調和Promise 原文自工程師Fernando Hernandez博客,傳送門 這兩個概念是Javascript編程語言的基本內容。因為這種語言是在異步編程的...

    liuyix 評論0 收藏0
  • JavaScript 異步

    摘要:從最開始的到封裝后的都在試圖解決異步編程過程中的問題。為了讓編程更美好,我們就需要引入來降低異步編程的復雜性。寫一個符合規(guī)范并可配合使用的寫一個符合規(guī)范并可配合使用的理解的工作原理采用回調函數來處理異步編程。 JavaScript怎么使用循環(huán)代替(異步)遞歸 問題描述 在開發(fā)過程中,遇到一個需求:在系統(tǒng)初始化時通過http獲取一個第三方服務器端的列表,第三方服務器提供了一個接口,可通過...

    tuniutech 評論0 收藏0
  • [譯] 深入理解 Promise 五部曲:5. LEGO

    摘要:一個就像一個樂高玩具。問題是不是你小時候玩兒的那個有趣,它們不是充滿想象力的打氣筒,也不是一種樂高玩具。這是對的并不是給開發(fā)者使用的,它們是給庫作者使用的。不會超過這兩種情況。第二個是根據第一個處理函數如何運行來自動變成狀態(tài)成功或者失敗。 原文地址:http://blog.getify.com/promis... 在 Part4:擴展問題 中,我討論了如何擴展和抽象Promise是多么...

    LiveVideoStack 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<