国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

關于Promise 異步編程的實例講解

2019-11-19 15:35:30
字體:
來源:轉載
供稿:網友

實例如下所示:

//1.解決異步回調問題//1.1 如何同步異步請求//如果幾個異步操作之間并沒有前后順序之分,但需要等多個異步操作都完成后才能執行后續的任務,無法實現并行節約時間const fs = require('fs');let school = {};fs.readFile('./name.txt','utf8',function (err,data) {  school.name = data;});fs.readFile('./age.txt','utf8',function (err,data) {  school.age = data;});console.log(school);//1.2如何解決回調地獄//在需要多個操作的時候,會導致多個回調函數嵌套,導致代碼不夠直觀,就是常說的回調地獄const fs = require('fs');fs.readFile('./content.txt','utf8',function (err,data) {  if(err)console.log(err);  fs.readFile(data,'utf8',function (err,data) {    if(err)console.log(err);    console.log(data);  })});//2.Promise//Promise本意是承諾,在程序中的意思就是承諾我過一段時間后會給你一個結果。 什么時候會用到過一段時間?答案是異步操作,異步是指可能比較長時間才有結果的才做,例如網絡請求、讀取本地文件等//3.Promise的三種狀態//例如媳婦說想買個包,這時候他就要"等待"我的回復,我可以過兩天買,如果買了表示"成功",如果我最后拒絕表示"失敗",當然我也有可能一直拖一輩子//Pending Promise對象實例創建時候的初始狀態//Fulfilled 可以理解為成功的狀態//Rejected 可以理解為失敗的狀態//then 方法就是用來指定Promise 對象的狀態改變時確定執行的操作,resolve 時執行第一個函數(onFulfilled),reject 時執行第二個函數(onRejected)//4.構造一個Promise//4.1 promise的方法會立刻執行let promise = new Promise(()=>{  console.log('hello');});console.log('world');//4.2 promise也可以代表一個未來的值const fs = require('fs');let promise = new Promise((resolve,reject)=>{  fs.readFile('./content.txt','utf8',function (err,data) {    if(err)console.log(err);    resolve(data);  })});promise.then(data =>{  console.log(data);});//4.3 代表一個用于不會返回的值const fs = require('fs');let promise = new Promise((resolve,reject)=>{});promise.then(data =>{  console.log(data);});//4.4 應用狀態實現拋硬幣function flip_coin() {  return new Promise((resolve,reject)=>{    setTimeout(function () {      var random = Math.random();      if(random > 0.5){        resolve('正');      }else{        resolve('反');      }    },2000)  })}flip_coin().then(data=>{  console.log(data);},data=>{  console.log(data);});//5.實現簡單的Promisefunction Promise(fn) {  fn((data)=>{    this.resolve(data)  },(data)=>{    this.reject(data);  })}Promise.prototype.resolve = function (data) {  this._success(data)};Promise.prototype.reject = function (data) {  this._error(data);};Promise.prototype.then = function (success,error) {  this._success = success;  this._error = error;};//6.Error會導致觸發Reject//可以采用then的第二個參數捕獲失敗,也可以通過catch函數進行捕獲function flip_coin() {  return new Promise((resolve,reject)=>{    throw Error('沒有硬幣')  })}flip_coin().then(data=>{  console.log(data);}).catch((e)=>{  console.log(e);})//7.Promise.all實現并行//接受一個數組,數組內都是Promise實例,返回一個Promise實例,這個Promise實例的狀態轉移取決于參數的Promise實例的狀態變化。當參數中所有的實例都處于resolve狀態時,返回的Promise實例會變為resolve狀態。如果參數中任意一個實例處于reject狀態,返回的Promise實例變為reject狀態const fs = require('fs');let p1 = new Promise((resolve,reject)=>{  fs.readFile('./name.txt','utf8',function (err,data) {    resolve(data);  });})let p2 = new Promise((resolve,reject)=>{  fs.redFile('./age.txt','utf8',function (err,data) {    resolve(data);  });})Promise.all([p1,p2]).then(([res1,res2])=>{  console.log(res1);})//不管兩個promise誰先完成,Promise.all 方法會按照數組里面的順序將結果返回//8.Promise.race實現選擇接受一個數組,數組內都是Promise實例,返回一個Promise實例,這個Promise實例的狀態轉移取決于參數的Promise實例的狀態變化。當參數中任何一個實例處于resolve狀態時,返回的Promise實例會變為resolve狀態。如果參數中任意一個實例處于reject狀態,返回的Promise實例變為reject狀態。const fs = require('fs');let p1 = new Promise((resolve,reject)=>{  fs.readFile('./name.txt','utf8',function (err,data) {    resolve(data);  });})let p2 = new Promise((resolve,reject)=>{  fs.readFile('./age.txt','utf8',function (err,data) {    resolve(data);  });})Promise.race([p1,p2]).then(([res1,res2])=>{  console.log(res1,res2);})9.Promise.resolve//返回一個Promise實例,這個實例處于resolve狀態。Promise.resolve('成功').then(data=>{  console.log(data);})10.Promise.reject//返回一個Promise實例,這個實例處于reject狀態Promise.reject('失敗').then(data=>{  console.log(data);},re=>{  console.log(re);})//11.封裝ajaxfunction ajax({url=new Error('url必須提供'),method='GET',async=true,dataType='json'}){ return new Promise(function(resolve,reject){   var xhr = new XMLHttpRequest();   xhr.open(method,url,async);   xhr.responseType = dataType;   xhr.onreadystatechange = function(){     if(xhr.readyState == 4){       if(/^2/d{2}/.test(xhr.status)){        resolve(xhr.response);       }else{         reject(xhr.response);       }     }   }   xhr.send(); });}//12.chain中返回結果Promise.resolve([1,2,3]).then(arr=>{  return [...arr,4]}).then(arr=>{  return [...arr,5]}).then(arr=>{  console.log(arr);})//13.chain中返回promise//then中的結果是promise的resolve后的結果Promise.resolve('user').then(data=>{  return new Promise(function (resolve,reject) {    fetch('/'+data).then(res=>res.json().then((json)=>{      resolve(json)    }))  })}).then(data=>{  console.log(data);});//改寫的更簡單些Promise.resolve('user').then(data=>{  return fetch('/'+data)}).then(res=>{  return res.json();}).then(data=>{  console.log(data);})//14.async/await//本質是語法糖,await與async要連用,await后只能跟promiseasync function getHello() {  return new Promise((resolve,reject) => {    setTimeout(function () {      resolve('hello');    },2000);  })}async function getData () {  var result = await getHello();  console.log(result);} ;getData();

以上這篇基于Promise 異步編程的實例講解就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漯河市| 施秉县| 清丰县| 出国| 江陵县| 蓬安县| 措勤县| 元朗区| 焦作市| 昌江| 苍梧县| 杂多县| 衡南县| 庆阳市| 安吉县| 怀仁县| 莲花县| 师宗县| 温泉县| 阜宁县| 依安县| 顺平县| 松阳县| 武宁县| 临猗县| 浑源县| 奉节县| 马鞍山市| 绥化市| 闵行区| 米泉市| 武夷山市| 九寨沟县| 万州区| 郎溪县| 柘城县| 十堰市| 石阡县| 门源| 姚安县| 会理县|