摘要:一涉及技術二簡介官方文檔三種狀態進行中已完成,又稱已失敗只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
一、涉及技術
jquery、vue、php
二、Promise簡介MDN官方文檔:Promise
三種狀態:
Pending(進行中)
Resolved(已完成,又稱 Fulfilled)
Rejected(已失?。?/p>
只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。
三、常用方法Promise.resolve()
Promise.reject()
Promise.prototype.catch()
Promise.prototype.then()
Promise.all()
Promise.race()
四、簡單示例 1、多個Promise使用var promise = new Promise(function(resolve, reject) { setTimeout(function() { resolve("hello"); }, 1000); }); promise.then(function(str) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(str+" world"); }, 1000); }); }).then(function(str) { return new Promise(function(resolve, reject) { setTimeout(function() { resolve(str+" !"); }, 1000); }); }).then(function(str) { console.log(str); // 3秒后打印 hello world ! });2、catch與finaly
var promise = new Promise(function(resolve, reject) { setTimeout(function() { reject("異步報錯~"); }, 1000); }).catch(function(err) { // 捕獲reject暴露的錯誤 console.log(err); }).finally(function() { // 不管resolve/reject都執行 console.log("complete"); });五、前后端配合 1、單個Promise
后端數據
demo.php
// 獲取隨機字符串 function getRandChar($length) { $str = ""; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol)-1; for($i=0;$i<$length;$i++){ $str.=$strPol[rand(0,$max)]; } return $str; } if($_GET["action"] == "test") { $data = [ ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ["name"=>getRandChar(6), "age"=>rand(1,50)], ]; echo json_encode($data); }
前端頁面
demo.html
promise
- {{ index }} {{ item.name }}
運行結果:
2、Promise.all()Promise.all(p1, p2, ...),此方法需要所有的promise都成功才成功。。
var promise1 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("請求報錯~"); } }); }); var promise2 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("請求報錯~"); } }); }); var promiseAll = Promise.all([promise1, promise2]); promiseAll.then(function(data) { console.log(data); }, function(err) { console.log(err); });
結果
如果我們把其中一個url 改成 demo2.php?action=test 就會請求失敗~
Promise.all() 和 jquery的$.when() 有些類似
$.when()的寫法
var ajax1 = $.ajax({type: "get", url: "demo1.php", data: {}, dataType: "json"}), ajax2 = $.ajax({type: "get", url: "demo2.php", data: {}, dataType: "json"}), ajax3 = $.ajax({type: "get", url: "demo3.php", data: {}, dataType: "json"}); $.when([ajax1, ajax2, ajax3]).then(function(data1, data2, data3) { console.log(data1, data2, data3); }, function() { console.log("%c 請求報錯~", "color: red"); });3、Promise.race()
Promise.race(p1, p2, ...),這個方法會返回率先成功的那個,如果都不成功,則執行reject。
var promise1 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("請求報錯~"); } }); }); var promise2 = new Promise(function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("請求報錯~"); } }); }); var promiseRase = Promise.race([promise1, promise2]); promiseRase.then(function(data) { console.log(data); }, function(err) { console.log(err); });4、多個ajax請求
var app = new Vue({ el: "#app", data: { list: [] }, methods: { ajaxReq: function(resolve, reject) { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res); }, error: function() { reject("請求報錯~"); } }); } }, mounted: function() { var promise1 = new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); promise1.then((data)=> { console.log("第一次:", data); return new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); }).then((data) => { console.log("第二次:", data); return new Promise((resolve, reject) => { this.ajaxReq(resolve, reject); }); }).then((data) => { console.log("第三次:", data); }); } });
這是使用了函數封裝,實際上項目中,可能不是這樣的,連貫操作,可能是下一個請求需要上一個請求的返回值
var promise1 = new Promise((resolve, reject) => { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res, 2); }, error: function() { reject("請求報錯~"); } }); }); promise1.then((data)=> { if(data.length > 0) { return new Promise((resolve, reject) => { $.ajax({ type: "get", url: "demo.php?action=test", dataType: "json", success: function(res) { resolve(res.concat(data)); // 因為resolve只能接口一個參數,所以concat了一下 }, error: function() { reject("請求報錯~"); } }); }); } }).then((data1) => { console.log(data1); });
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/89384.html
摘要:一簡介函數是引入的新型函數,用于異步編程,跟對象聯合使用的話會極大降低異步編程的編寫難度和閱讀難度。二簡單示例和注意函數不能直接使用,是通過方法獲取的返回結果,而可以提前終止函數。 一、簡介 Generator函數是ES6引入的新型函數,用于異步編程,跟Promise對象聯合使用的話會極大降低異步編程的編寫難度和閱讀難度。 與普通函數的區別: function關鍵字與函數名之間有一個...
摘要:指的是計算機系統的一種運行機制。環境中的執行順序是隨機的這一次,徹底弄懂執行機制的規范和實現 showImg(https://segmentfault.com/img/remote/1460000012913034?w=800&h=421); Event Loop指的是計算機系統的一種運行機制。JavaScript采用此機制解決單線程引發相關問題 在瀏覽器中的web應用會涉及到.Jav...
摘要:最近看了一下項目,它是基于創建的項目創建項目安裝默認手動選擇配置,看個人項目需求支持使用書寫源碼支持。支持代碼風格檢查和格式化。權限驗證那里也做了遞歸的處理不顯示在菜單欄。組件內的在組件內使用可以拿到 最近看了一下vue-element-admin項目,它是基于vue-cli3創建的項目 創建vue-cli3項目 安裝vue-cli npm install -g @vue/cli v...
閱讀 1256·2021-09-01 10:30
閱讀 2139·2021-07-23 10:38
閱讀 909·2019-08-29 15:06
閱讀 3164·2019-08-29 13:53
閱讀 3285·2019-08-26 11:54
閱讀 1840·2019-08-26 11:38
閱讀 2381·2019-08-26 10:29
閱讀 3136·2019-08-23 18:15