亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS PromiseLike的判定與使用詳解

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

一. $.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è)務處理
        return;
    }
   
    console.log("返回的最終值為:");
    console.log(result);
});

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

相關文章

  • 原生JS實現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼

    原生JS實現(xiàn)H5轉(zhuǎn)盤游戲的示例代碼

    這篇文章主要介紹了如何利用原生JS實現(xiàn)轉(zhuǎn)盤游戲,可以自由調(diào)整概率。文中的示例代碼講解詳細,對我們學習JavaScript有一定幫助,需要的可以參考一下
    2022-03-03
  • spirngmvc js傳遞復雜json參數(shù)到controller的實例

    spirngmvc js傳遞復雜json參數(shù)到controller的實例

    下面小編就為大家分享一篇spirngmvc js傳遞復雜json參數(shù)到controller的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-03-03
  • 神級程序員JavaScript300行代碼搞定漢字轉(zhuǎn)拼音

    神級程序員JavaScript300行代碼搞定漢字轉(zhuǎn)拼音

    這篇文章主要介紹了神級程序員JavaScript300行代碼搞定漢字轉(zhuǎn)拼音,需要的朋友可以參考下
    2017-05-05
  • 對table和ul實現(xiàn)js分頁示例分享

    對table和ul實現(xiàn)js分頁示例分享

    本文主要介紹了js對table和ul li實現(xiàn)前臺分頁,需要的朋友可以參考下
    2014-02-02
  • javascript實現(xiàn)炫酷的拖動分頁

    javascript實現(xiàn)炫酷的拖動分頁

    非常酷的javascript拖動分頁功能,無縫循環(huán)分頁,拖動鼠標即可完成分頁,鼠標向左拖動回到前一頁,向右拖動則翻開第二頁,還帶有動畫特效,著實很不錯,界面黑色,非主流風格,相信很多人會喜歡的。
    2015-05-05
  • js實現(xiàn)簡單的驗證碼

    js實現(xiàn)簡單的驗證碼

    這篇文章主要介紹了js實現(xiàn)簡單驗證碼的方法,驗證碼主要是為了網(wǎng)站的安全性,防止惡意注冊和登陸,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2015-12-12
  • 微信接入之獲取用戶頭像的方法步驟

    微信接入之獲取用戶頭像的方法步驟

    這篇文章主要介紹了微信接入之獲取用戶頭像的方法步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09
  • 利用JS對iframe父子(內(nèi)外)頁面進行操作的方法教程

    利用JS對iframe父子(內(nèi)外)頁面進行操作的方法教程

    這篇文章主要給大家介紹了利用JS對iframe父子(內(nèi)外)頁面進行操作的方法教程,其中包括了怎么對iframe進行操作、在iframe里面控制iframe外面的js代碼以及在父框架對子iframe進行操作等,需要的朋友可以參考借鑒。
    2017-06-06
  • JsRender for index循環(huán)索引用法詳解

    JsRender for index循環(huán)索引用法詳解

    這篇文章主要介紹了JsRender for index循環(huán)索引用法,以實例形式詳細分析了JsRender中循環(huán)的用法,需要的朋友可以參考下
    2014-10-10
  • js 蒙版進度條(結合圖片)

    js 蒙版進度條(結合圖片)

    js 結合圖片實現(xiàn)的蒙版進度條效果。
    2010-03-03

最新評論