JS PromiseLike 的判定與使用

目錄

  • 一. $.ajax()返回值遇到的問題
  • 二. Promise A+ 規范
  • 三. 判斷是否為PromiseLike
    • 3.1 判斷ES6的new Promise()
    • 3.2 判斷包含then方法的對象
    • 3.3 判斷$.ajax()返回的對象


一. $.ajax()返回值遇到的問題

當我們執行如下js代碼時,可以看到$.ajax()執行后,得到的response對象并不為空,并且response對象的responseJSON屬性也確實是有值的。

但是,當我們執行response.responseJSON后,得到的居然是undefined
并且我們使用await 對response對象等待后,得到的就直接是response.responseJSON中的值。

setTimeout(async () => {const response = $.ajax({url: "https://api.github.com/users/fengyehong123",type: 'GET',});console.log(response);console.log(response.responseJSON);  // undefinedconst result = await response;console.log(result);}, 1000);

?執行效果如下:

在這里插入圖片描述

🤔上述現象是因為 $.ajax()得到的對象是一個 Promise Like對象,Promise Like對象和ES6的new Promise()一樣,都是對 Promise A+ 規范的實現,因此可以使用 await 進行等待。


二. Promise A+ 規范

官網: https://promisesaplus.com/

ES6的new Promise()也好,$.ajax()函數返回的Promise Like對象也好,
都只是Promise A+規范的一種實現,該規范告訴我們如何自己實現一個Promise。


三. 判斷是否為PromiseLike

?如果一個值的類型為 object 或者 function
并且 該值還存在一個then方法
那么 該值就是一個 PromiseLike 對象。

// 判斷是否為 Promise Likefunction isPromiseLike(value) {if(value === null) {return false;}if ((typeof value === 'object' || typeof value === 'function') && (typeof value.then === 'function')){return true;}return false;
}

3.1 判斷ES6的new Promise()

?ES6 的 new Promise() 是 Promise A+ 規范的實現,所以肯定是一個 PromiseLike 對象

const promise_obj = new Promise((resolve, reject) => {resolve('楓葉紅');
});
console.log(isPromiseLike(promise_obj) ? "promise_obj是PromiseLike對象" : "promise_obj非PromiseLike對象");

3.2 判斷包含then方法的對象

?定義一個對象,對象里面有一個then方法,方法里面是耗時操作。符合該對象是一個Promise Like對象。

const then_response = {then: function(resolve, reject) {setTimeout(() => {resolve('賈飛天');}, 1000)}
}
console.log(isPromiseLike(then_response) ? "then_response是PromiseLike對象" : "then_response非PromiseLike對象"
);
// then_response是PromiseLike對象(async (response) => {/*此處的response實際上是then_response因為 then_response 是一個 Promise Like 對象要想await的話,必須包裹在 函數中因此此處定義了一個立即執行函數,還可以避免給函數取名的麻煩*/const result = await response;console.log(result);
})(then_response);

3.3 判斷$.ajax()返回的對象

// ?兩秒之后發送ajax請求
setTimeout(async () => {const response = $.ajax({url: "https://api.github.com/users/fengyehong123",type: 'GET',});// 是一個PromiseLike對象console.log(isPromiseLike(response) ? "response是PromiseLike對象" : "response非PromiseLike對象");// response是PromiseLike對象// 正因為是 PromiseLike對象 ,所以才可以進行awaitconst result = await response;console.log(result);
}, 2000);

?也就是說,我們之后的$.ajax()函數可以這么寫

// ajax的請求對象
const jqRequest = $.ajax({url,method: 'GET'
});// doneCallBack,failCallBack,alwaysCallback 是從外部傳入的回調函數
jqRequest.done(function(data, textStatus, jqXHR) {doneCallBack && doneCallBack(data);
}).fail(function(jqXHR, textStatus, errorThrown) {failCallBack && failCallBack();
}).always(function() {alwaysCallback && alwaysCallback();
});

?也可以這么寫,從而可以避免回調的方式

document.querySelector('#btn').addEventListener('click', async function() {const url = "https://api.github.com/users/fengyehong123";// 后端的返回值let result = null;try {result = await $.ajax({url,type: 'GET',});} catch (error) {const {responseJSON} = error;console.log(`請求失敗!原因是: ${responseJSON}`);} finally {console.log("請求完成!");}if(!result) {// 進行相應的業務處理return;}console.log("返回的最終值為:");console.log(result);
});

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/163104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/163104.shtml
英文地址,請注明出處:http://en.pswp.cn/news/163104.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux python安裝 虛擬環境 virtualenv

根目錄創建 venvs 文件夾 sudo mkdir /venvs 進入 /venvs 目錄 cd /venvsp 創建虛擬環境,前提要按照 python3 安裝 的 命令 sudo apt install python3 sudo python3 -m venv 虛擬環境名 激活虛擬環境 sourcepippip /venvs/zen-venv/bin/activatepinpi 安裝flask pip…

【C語言】深入解開指針(四)

🌈write in front :🔍個人主頁 : 啊森要自信的主頁 ??真正相信奇跡的家伙,本身和奇跡一樣了不起啊! 歡迎大家關注🔍點贊👍收藏??留言📝>希望看完我的文章對你有小小的幫助&am…

centos7上用docker部署mysql 5.7,并解決中文亂碼問題

1. 安裝docker 查看這篇文章的前半部分即可: 虛擬機上安裝docker,并安裝flink鏡像 2. 安裝mysql 5.7 2.1 下載mysql鏡像 可以使用docker search mysql命令查看遠程鏡像倉庫中的鏡像信息,或者訪問dockerhub去找需要的鏡像 這里直接拉取鏡像…

ubuntu借助overlay方案實現重啟自動還原

配置重啟還原OS 首先:sudo apt install overlayroot 安裝一下軟件 然后編輯配置文件:/etc/overlayroot.conf * overlayroottmpfs or overlayroottmpfs:PARAMETERS write all changes to a temporary (ram only) backing device A tmpfs mount will …

ubuntu22.04安裝wvp-gb28181-pro 2023-11-23最新版本(一鍵安裝)

下載程序 輸入下面命令,輸入普通用戶密碼,切換到 root用戶 sudo su git clone -b ubuntu_wvp_online_install_2023_0425 https://gitcode.net/zenglg/ubuntu_wvp_online_install.git 等待下載完成 安裝 進入到克隆下來的路徑中 cd /home/tuners/ub…

萬界星空科技低代碼云MES系統

所謂“云MES”,它是基于MES管理云平臺儲存大數據運算而來,區別于一般管理系統,云MES操作運行不需要獨立的服務器去儲存和運行,而是通過云端進行數據、儲存、運行,最后將計算完的數據在MES系統上呈現,呈現端…

讓國內AI模型解題:滑動窗口中找出最大值,文心一言,通義千問錯誤率100%,訊飛星火略勝一籌

最近,一些大廠陸續放出了自己的AI模型,處于日常的使用和準確度,我通過一道試題來看一下文心一言、訊飛星火和通義千萬的回答結果 本道題是一道很經典的算法題,請在滑動窗口中找出最大值 文心一言 第一次給出答案 package main…

vue中v-if與v-for的優先級?

?🌈個人主頁:前端青山 🔥系列專欄:Vue篇 🔖人終將被年少不可得之物困其一生 依舊青山,本期給大家帶來vue篇專欄內容:vue中v-if與v-for的優先級? 目錄 v-if和v-for的優先級是什么? 一、作用 二、優先級…

移動機器人,開啟智能柔性制造新篇章

智能制造是當今工業發展的必然趨勢,而柔性制造則是智能制造的重要組成部分。在這個快速變革的時代,如何提高生產效率、降低成本、增強靈活性成為了制造業的關鍵挑戰。富唯智能移動機器人應運而生,為柔性制造注入了新的活力。 基于富唯智能AI-…

凸問題與非凸問題

凸函數:曲線上任意兩點連線上的點對應的函數值不大于該兩點對應的函數值得連線上的值,例如yx^2; 非凸函數:曲線上任意兩點連線上的點對應的函數值既有大于該兩點對應的函數值得連線上的值的部分也有小于的部分,例如&am…

Re51:讀論文 Language Models as Knowledge Bases?

諸神緘默不語-個人CSDN博文目錄 諸神緘默不語的論文閱讀筆記和分類 論文名稱:Language Models as Knowledge Bases? ArXiv網址:https://arxiv.org/abs/1909.01066 官方GitHub項目:https://github.com/facebookresearch/LAMA 本文是2019年…

軟件測試個人求職簡歷該怎么寫,模板在這里

1、個人資料 姓名:xxx性別:x 手機號碼:138888888xx郵箱:xxx 學歷:本科專業:電子商務 英語:四級當前工作:測試工程師 從業時間:4年期望薪資:面議 求職意向軟件…

FIB表與快速轉發表實驗

實驗名稱:FIB表與快速轉發表實驗 網絡拓撲圖: 實驗步驟: 1、配置接口的IP地址 R1: R2: 2、配置OSPF路由協議 在R1宣告網段 在R2宣告網段 3、查看鄰居狀態,一直處于2-way狀態,要等待30秒&…

SAP 權限設置維護

權限設置維護 su21 點擊創建自己的 對象類(OBJECT CLASS ) Z... 在點擊創建授權對象 輸入對象名 z... 對象名文本 字段名:ACTVT 點擊允的許活 按鈕 里面增刪改查等權限.... 保存 .權限對象 保存后需要 pfcg 配置權限對象 分…

a標簽超鏈接 —— 實現點擊前中后變色

淺淺記錄下 <style type"text/css"> a:link {color: yellow; /*未訪問鏈接顏色*/ }a:visited {color: red; /*已訪問鏈接顏色*/ }a:hover {color: blue; /*鼠標移動到鏈接顏色*/text-decoration: underline; }a:active {color: orange; /*鼠標點擊時顏色*/ }a…

二叉樹:C++實現

引言&#xff1a; 二叉樹是一種常見的數據結構&#xff0c;它具有良好的適用性和靈活性&#xff0c;能夠應用于各種領域。在C中實現二叉樹可以通過使用模板類和結構體來實現。下面我們將介紹如何在C中實現二叉樹&#xff0c;并提供一些基本的操作方法。 技術實現&#xff1a; …

如何將音頻添加到視頻并替換視頻中的音軌

隨著視頻流媒體網站的流行和便攜式設備的發展&#xff0c;你可能越來越傾向于自己制作視頻并在互聯網上分享。有時&#xff0c;你可能還需要編輯視頻并為其添加背景音樂&#xff0c;因為音樂總是對視頻的感知起著神奇的作用。 那如何給視頻添加音頻呢&#xff1f;或者如何用新…

阿里云跨賬號建立局域網

最近有活動&#xff0c;和好友一并薅了下阿里云的羊毛。琢磨著兩臺機器組一個局域網&#xff0c;于是有了這個需求&#xff0c;把步驟記錄一下&#xff1a; 假設兩臺機器叫A和B&#xff0c;我們開始進行建立和組網 1. 建立ECS 把A機器公共環境裝好&#xff0c;然后使用《實例與…

深入解析Java 8中HashMap的底層原理

引言 HashMap是Java中常用的集合類&#xff0c;用于存儲鍵值對。其底層實現經過多次優化&#xff0c;包括哈希算法、數組擴容、鏈表轉紅黑樹等。本文將深入研究HashMap的底層原理&#xff0c;并詳細探討如何解決哈希碰撞的技術。 1. 哈希算法 HashMap的核心是哈希算法&#…

Day38:518.零錢兌換II、377. 組合總和 Ⅳ

文章目錄 518.零錢兌換II思路代碼實現 377. 組合總和 Ⅳ思路代碼實現 518.零錢兌換II 題目鏈接 思路 確定dp數組&#xff08;dp table&#xff09;以及下標的含義 dp[j]&#xff1a;組合元素和為j的組合方式確定遞推公式 題目不是選取最優解&#xff0c;而是求路徑總和&…