欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

關(guān)于Promise 異步編程的實例講解

 更新時間:2017年09月01日 08:49:49   投稿:jingxian  
下面小編就為大家?guī)硪黄P(guān)于Promise 異步編程的實例講解。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

實例如下所示:

//1.解決異步回調(diào)問題
//1.1 如何同步異步請求
//如果幾個異步操作之間并沒有前后順序之分,但需要等多個異步操作都完成后才能執(zhí)行后續(xù)的任務(wù),無法實現(xiàn)并行節(jié)約時間

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如何解決回調(diào)地獄
//在需要多個操作的時候,會導(dǎo)致多個回調(diào)函數(shù)嵌套,導(dǎo)致代碼不夠直觀,就是常說的回調(diào)地獄

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本意是承諾,在程序中的意思就是承諾我過一段時間后會給你一個結(jié)果。 什么時候會用到過一段時間?答案是異步操作,異步是指可能比較長時間才有結(jié)果的才做,例如網(wǎng)絡(luò)請求、讀取本地文件等

//3.Promise的三種狀態(tài)
//例如媳婦說想買個包,這時候他就要"等待"我的回復(fù),我可以過兩天買,如果買了表示"成功",如果我最后拒絕表示"失敗",當(dāng)然我也有可能一直拖一輩子

//Pending Promise對象實例創(chuàng)建時候的初始狀態(tài)
//Fulfilled 可以理解為成功的狀態(tài)
//Rejected 可以理解為失敗的狀態(tài)
//then 方法就是用來指定Promise 對象的狀態(tài)改變時確定執(zhí)行的操作,resolve 時執(zhí)行第一個函數(shù)(onFulfilled),reject 時執(zhí)行第二個函數(shù)(onRejected)
//4.構(gòu)造一個Promise
//4.1 promise的方法會立刻執(zhí)行
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 應(yīng)用狀態(tài)實現(xiàn)拋硬幣
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.實現(xiàn)簡單的Promise
function 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會導(dǎo)致觸發(fā)Reject
//可以采用then的第二個參數(shù)捕獲失敗,也可以通過catch函數(shù)進行捕獲

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實現(xiàn)并行
//接受一個數(shù)組,數(shù)組內(nèi)都是Promise實例,返回一個Promise實例,這個Promise實例的狀態(tài)轉(zhuǎn)移取決于參數(shù)的Promise實例的狀態(tài)變化。當(dāng)參數(shù)中所有的實例都處于resolve狀態(tài)時,返回的Promise實例會變?yōu)閞esolve狀態(tài)。如果參數(shù)中任意一個實例處于reject狀態(tài),返回的Promise實例變?yōu)閞eject狀態(tài)

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 方法會按照數(shù)組里面的順序?qū)⒔Y(jié)果返回
//8.Promise.race實現(xiàn)選擇接受一個數(shù)組,數(shù)組內(nèi)都是Promise實例,返回一個Promise實例,這個Promise實例的狀態(tài)轉(zhuǎn)移取決于參數(shù)的Promise實例的狀態(tài)變化。當(dāng)參數(shù)中任何一個實例處于resolve狀態(tài)時,返回的Promise實例會變?yōu)閞esolve狀態(tài)。如果參數(shù)中任意一個實例處于reject狀態(tài),返回的Promise實例變?yōu)閞eject狀態(tài)。

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狀態(tài)。

Promise.resolve('成功').then(data=>{
  console.log(data);
})
10.Promise.reject
//返回一個Promise實例,這個實例處于reject狀態(tài)

Promise.reject('失敗').then(data=>{
  console.log(data);
},re=>{
  console.log(re);
})
//11.封裝ajax
function 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中返回結(jié)果
Promise.resolve([1,2,3])
.then(arr=>{
  return [...arr,4]
}).then(arr=>{
  return [...arr,5]
}).then(arr=>{
  console.log(arr);
})
//13.chain中返回promise
//then中的結(jié)果是promise的resolve后的結(jié)果

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
//本質(zhì)是語法糖,await與async要連用,await后只能跟promise

async function getHello() {
  return new Promise((resolve,reject) => {
    setTimeout(function () {
      resolve('hello');
    },2000);
  })
}
async function getData () {
  var result = await getHello();
  console.log(result);
} ;
getData();

以上這篇基于Promise 異步編程的實例講解就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • uniapp小程序之配置首頁搜索框功能的實現(xiàn)

    uniapp小程序之配置首頁搜索框功能的實現(xiàn)

    這篇文章主要介紹了uniapp小程序之配置首頁搜索框,我們介紹一下本次開發(fā)使用的是uniapp,本次分享內(nèi)容的搜索框為禁止輸入搜索框,點擊跳轉(zhuǎn)專屬搜索頁面,需要的朋友可以參考下
    2022-09-09
  • Javascript模仿淘寶信用評價實例(附源碼)

    Javascript模仿淘寶信用評價實例(附源碼)

    這篇文章主要介紹了Javascript模仿淘寶信用評價功能實現(xiàn)方法,以完整實例形式分析了JavaScript響應(yīng)鼠標(biāo)事件動態(tài)改變頁面元素的相關(guān)技巧,并附帶了完整的實例代碼供讀者下載參考,需要的朋友可以參考下
    2015-11-11
  • js 失去焦點時關(guān)閉層實現(xiàn)代碼

    js 失去焦點時關(guān)閉層實現(xiàn)代碼

    失去焦點時關(guān)閉層實現(xiàn)代碼。大家可以參考下。
    2009-05-05
  • js實現(xiàn)手機發(fā)送驗證碼功能

    js實現(xiàn)手機發(fā)送驗證碼功能

    本文主要介紹了js實現(xiàn)手機發(fā)送驗證碼功能的示例。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript編寫一個貪吃蛇游戲

    JavaScript編寫一個貪吃蛇游戲

    本文主要介紹了JavaScript寫的一個貪吃蛇游戲的實例,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • JavaScript 解決ajax中parsererror錯誤案例詳解

    JavaScript 解決ajax中parsererror錯誤案例詳解

    這篇文章主要介紹了JavaScript 解決ajax中parsererror錯誤案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • redux.js詳解及基本使用

    redux.js詳解及基本使用

    Redux我們可以把它理解成一個狀態(tài)管理器,可以把狀態(tài)(數(shù)據(jù))存在Redux中,以便增、刪、改。這篇文章主要介紹了redux.js詳解及基本使用,需要的朋友可以參考下
    2019-05-05
  • 一款js和css代碼壓縮工具[附JAVA環(huán)境配置方法]

    一款js和css代碼壓縮工具[附JAVA環(huán)境配置方法]

    壓縮css和js是我們工作中經(jīng)常要處理的一件事,這里介紹的是一款基于YUICompressor,淘寶封裝的css和js壓縮工具TBCompressor.
    2010-04-04
  • javascript實現(xiàn)下雪效果【實例代碼】

    javascript實現(xiàn)下雪效果【實例代碼】

    下面小編就為大家?guī)硪黄猨avascript實現(xiàn)下雪效果【實例代碼】。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考
    2016-05-05
  • HTML+CSS+JS實現(xiàn)抓娃娃機游戲

    HTML+CSS+JS實現(xiàn)抓娃娃機游戲

    這篇文章主要介紹了如何利用HTML+CSS+JS制作抓娃娃機游戲,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論