最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JS PromiseLike的判定與使用詳解

 更新時間:2023年11月23日 14:55:44   作者:fengyehongWorld  
本文主要介紹了JS PromiseLike的判定與使用詳解, 文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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

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

但是,當我們執(zhí)行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);  // undefined

    const result = await response;
    console.log(result);

}, 1000);

執(zhí)行效果如下:

在這里插入圖片描述

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

二. Promise A+ 規(guī)范

官網(wǎng): https://promisesaplus.com/

ES6的new Promise()也好,$.ajax()函數(shù)返回的Promise Like對象也好,
都只是Promise A+規(guī)范的一種實現(xiàn),該規(guī)范告訴我們?nèi)绾巫约簩崿F(xiàn)一個Promise。

三. 判斷是否為PromiseLike

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

// 判斷是否為 Promise Like
 function 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+ 規(guī)范的實現(xiàn),所以肯定是一個 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的話,必須包裹在 函數(shù)中
        因此此處定義了一個立即執(zhí)行函數(shù),還可以避免給函數(shù)取名的麻煩
    */
    const result = await response;
    console.log(result);
})(then_response);

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

// ?兩秒之后發(fā)送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對象 ,所以才可以進行await
    const result = await response;
    console.log(result);
}, 2000);

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

// ajax的請求對象
const jqRequest = $.ajax({
    url,
    method: 'GET'
});

// doneCallBack,failCallBack,alwaysCallback 是從外部傳入的回調(diào)函數(shù)
jqRequest.done(function(data, textStatus, jqXHR) {
    doneCallBack && doneCallBack(data);
}).fail(function(jqXHR, textStatus, errorThrown) {
    failCallBack && failCallBack();
}).always(function() {
    alwaysCallback && alwaysCallback();
});

也可以這么寫,從而可以避免回調(diào)的方式

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) {
    	// 進行相應(yīng)的業(yè)務(wù)處理
        return;
    }
   
    console.log("返回的最終值為:");
    console.log(result);
});

到此這篇關(guān)于JS PromiseLike的判定與使用詳解的文章就介紹到這了,更多相關(guān)JS PromiseLike內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • new Date()問題在ie8下面的處理方法

    new Date()問題在ie8下面的處理方法

    本節(jié)主要介紹了ie8下面處理 new Date()的問題,需要的朋友可以參考下
    2014-07-07
  • webstorm中配置Eslint的兩種方式及差異比較詳解

    webstorm中配置Eslint的兩種方式及差異比較詳解

    這篇文章主要介紹了webstorm中配置Eslint的兩種方式及差異比較詳解,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • ExtJS實現(xiàn)文件下載的方法實例

    ExtJS實現(xiàn)文件下載的方法實例

    這篇文章介紹了ExtJS實現(xiàn)文件下載的方法實例,有需要的朋友可以參考一下
    2013-11-11
  • javascript實現(xiàn)相同事件名稱,不同命名空間的調(diào)用方法

    javascript實現(xiàn)相同事件名稱,不同命名空間的調(diào)用方法

    這篇文章主要介紹了javascript實現(xiàn)相同事件名稱,不同命名空間的調(diào)用方法,涉及javascript命名空間及事件調(diào)用的技巧,需要的朋友可以參考下
    2015-06-06
  • JavaScript字符串常用類使用方法匯總

    JavaScript字符串常用類使用方法匯總

    今天的這篇文章就分享幾年以來總結(jié)的一些最常見和最有用的字符串相關(guān)的方法的例子和簡要說明。便于程序員用于快速參考。當然,最有經(jīng)驗的開發(fā)人員對這些操作很熟悉,但我認為這是一個很好的方法幫助初學(xué)者理解這些函數(shù),他可以幫助你使用簡單的語法,完成復(fù)雜的操作.
    2015-04-04
  • 在JavaScript中獲取請求的URL參數(shù)[正則]

    在JavaScript中獲取請求的URL參數(shù)[正則]

    在ASP.NET后臺代碼中,對于這樣的URL請求地址:http://www.abc.com?id=001,我們可以通過Request.QueryString["id"]的方法很容易的獲取到URL中請求的參數(shù)的值,但是要在前臺js代碼中獲取請求的參數(shù)的值,應(yīng)該怎么做呢?
    2010-12-12
  • 使用js獲取地址欄參數(shù)的方法推薦(超級簡單)

    使用js獲取地址欄參數(shù)的方法推薦(超級簡單)

    下面小編就為大家?guī)硪黄褂胘s獲取地址欄參數(shù)的方法推薦(超級簡單)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • JavaScript實現(xiàn)文本目標字符替換和一鍵全部替換

    JavaScript實現(xiàn)文本目標字符替換和一鍵全部替換

    這篇文章主要介紹了JavaScript實現(xiàn)文本目標字符替換和一鍵全部替換,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-06-06
  • JavaScript?位運算及實際應(yīng)用實例

    JavaScript?位運算及實際應(yīng)用實例

    這篇文章主要為大家介紹了JavaScript位運算及實際應(yīng)用實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • 前端大文件分片MinIO上傳的詳細代碼

    前端大文件分片MinIO上傳的詳細代碼

    這篇文章主要給大家介紹了關(guān)于前端大文件分片MinIO上傳的詳細代碼,Minio支持分片上傳大文件,這個功能可以讓用戶將大文件劃分成小塊,然后在多個并行的HTTP請求中上傳這些小塊,從而提高上傳速度和穩(wěn)定性,需要的朋友可以參考下
    2024-09-09

最新評論

崇左市| 台中市| 长汀县| 丰顺县| 米林县| 肥城市| 绿春县| 邓州市| 犍为县| 太谷县| 工布江达县| 茌平县| 大庆市| 延庆县| 蒙山县| 漳州市| 陇川县| 吴旗县| 正镶白旗| 灵川县| 义乌市| 新宁县| 兴城市| 新安县| 通许县| 西贡区| 荃湾区| 昌邑市| 图片| 金秀| 碌曲县| 察隅县| 娱乐| 黔西| 包头市| 桦甸市| 吴川市| 阿克苏市| 油尖旺区| 瑞安市| 南通市|