JS PromiseLike 的判定与使用

news2024/9/30 11:29:49

目录

  • 一. $.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);  // undefined

    const 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 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+ 规范的实现,所以肯定是一个 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对象 ,所以才可以进行await
    const 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.coloradmin.cn/o/1242071.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一张图,了解美格智能高算力AI模组

美格智能高算力A模组,澎湃算力让AI触手可及!

【阿里云】图像识别

一、阿里云官网资料及配置本地 二、配置环境变量 三、C语言调用阿里云Python接口 一、阿里云官网资料及配置本地 阿里云官网 垃圾识别分类 sudo apt install python3-pip pip3 install alibabacloud_imagerecog20190930可能出现的网络问题 二、配置环境变量 配置环境变量A…

万界星空科技商业开源MES/免费MES/低代码MES

万界星空科技商业开源MES可以提供包括制造数据管理、计划排程管理、生产调度管理、库存管理、质量管理、人力资源管理、工作中心/设备管理、工具工装管理、采购管理、成本管理、项目看板管理、生产过程控制、底层数据集成分析、上层数据集成分解等管理模块,打造一个…

【第二部分:结构】ARM Realm Management Monitor specification

目录 概念Realm概述Realm执行环境Realm寄存器Realm内存Realm处理器功能IMPDEF系统寄存器 Realm属性Realm活性Realm生命周期状态状态转换 Realm参数Realm描述符 颗粒Granule颗粒属性颗粒所有权颗粒生命周期状态状态转换颗粒抹除 Realm执行上下文概述REC属性REC指数和MPIDR值REC生…

ElementPlusError: [ElOnlyChild] no valid child node found

突然发现页面报了一堆黄色的错误提示 查了下原来是这里导致的,只需要把v-if 挪到popover那层即可 解决

thingsboard3.6的mailConfigTemplateController错误

1、bug内容 使用3.6版本的tb代码进行打包生成boot的jar包,在启动的时候会报错mailConfigTemplateController bean初始化找不到文件路径。 Error creating bean with name mailConfigTemplateController defined in URL [jar:file:/D:/yuxinwei/AE/thingsboard/thingsboard-3…

ajax请求方式处理

1、前置准备 1.1、SpringBoot项目下:写一个controller RestController public class TestController {RequestMapping("/yyy")public void test(HttpServletRequest request, HttpServletResponse response){String yang request.getParameter("y…

三十分钟学会Shell(上)

Shell ​ Shell 本身并不是内核的一部分,它只是站在内核的基础上编写的一个应用程序,是用户和Linux文件系统之间的桥梁。Shell 有自己的特殊性,就是开机立马启动,并呈现在用户面前;用户通过 Shell 来使用 Linux&#x…

甲方使用外包真的能节约成本吗?

语:外包作为一种常见的业务模式,被广泛应用于各行各业。然而,甲方在选择外包时,是否真的能够实现成本节约呢?本文将从多个角度进行探讨。 正文: 降低人力成本:外包通常是将某些业务环节或项目交…

【8】Spring Boot 3 集成组件:安全组件 spring security【官网概念篇】

目录 【8】Spring Boot 3 集成组件:安全组件 spring securitySpring Security 简介先决条件引入依赖身份验证密码存储密码存储历史DelegatingPasswordEncoder密码存储格式密码加解密类自定义密码存储 体系结构 ArchitectureServlet 过滤器DelegatingFilterProxyFilt…

史诗级云故障敲响警钟,应用保障不能没有“连续键”!

近日,知名云服务商出现一次史诗级的云故障:全球所有区域/所有服务同时异常,故障持续长达3小时之多,云上众多应用受到极大影响。 如今,在一个充满不确定性和复杂性的数字化时代,哪怕是顶级云服务商亦不能避…

【原创分享】Mentor PADS PCB导入Altium Designer软件PCB详细教程

Mentor PADS PCB导入Altium Designer软件PCB详细教程 1、PADS软件绘制的PCB文件需要导出文件,用PADS软件打开PCB文件,单击“Export”,在参数设置界面,选择所有的元素。“Format”选择较低的版本,一般推荐选择5.0版本&…

idea手动导入maven包

当maven仓库中没有包时&#xff0c;我们需要手动导入jar到maven项目中 1.这里的maven设置成你自己安装的maven 2.查看pom.xml文件中maven&#xff0c;以下面为例 <dependency><groupId>com.jdd.pay</groupId><artifactId>mapi-sdk-v3</artifactId&…

【VSCode】VSCode 使用

目录 文章目录 目录插件配置设置代码不显示 git 提示 "xxx months ago | 1 author"设置打开项目不自动选择 CMakeLists 插件 以下插件为 C 开发偏好设置。 C/CCMakeCMake ToolsGitLensRemote DevelopmentRemote Explorer 配置 设置代码不显示 git 提示 “xxx mon…

安徽省广德市选择云轴科技ZStack Cloud云平台建设县级智慧城市

信创是数字中国建设的重要组成部分&#xff0c;也是数字经济发展的关键推动力量。作为云基础软件企业&#xff0c;云轴科技ZStack产品矩阵全面覆盖数据中心云基础设施&#xff0c;ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级&#xff0c;是其中唯一兼容四种…

PC8250(CC-CV控制)5V/8A同步降压恒流恒压软启动带EN功能只需极少外围元件

概述 PC8250是一个同步降压转换器输出电流至8A。它的设计允许操作电源电压范围从9V到42V。外部关闭功能可以通过逻辑电平来控制COMP/EN引脚下降&#xff0c;然后进入待机模式。外部补偿使反馈控制具有良好的线路和负载调节&#xff0c;外部设计灵活。PC8250在CC&#xff08;恒定…

关于植物单细胞转录组提核还是制备原生质体的思考

目前植物单细胞转录组测序主流平台的输入都是原生质体悬液或者细胞核悬液。 那么到底采用哪种更好呢&#xff1f; 啥&#xff1f; 成年人少做选择&#xff1f; 看看账上&#xff0c;摸摸兜里&#xff0c;得有财力支持啊&#xff01; 本期&#xff0c;聊聊这个主题&#xff0…

Java面试-微服务篇-SpringCloud

Java面试-微服务篇-SpringCloud SpringCloud 常见组件注册中心Eureka, Nacos负载均衡Ribbon服务雪崩, 熔断降级微服务的监控来源 SpringCloud 常见组件 通常情况下 Eureka: 注册中心Ribbon: 负载均衡Feign: 远程调用Hystrix: 服务熔断Zuul/Gateway: 网关 SpringCloudAlibaba…

景区智慧旅游智能化系统方案:PPT全文58页,附下载

关键词&#xff1a;智慧景区解决方案&#xff0c;智慧文旅解决方案&#xff0c;智慧旅游解决方案&#xff0c;智慧文旅综合运营平台 一、景区智慧旅游智能化系统建设背景 近年来&#xff0c;随着信息技术的快速发展和普及&#xff0c;以及旅游市场的不断扩大和升级&#xff0…

低压配电柜浪涌保护器综合选型方案

地凯科技低压配电柜是指在额定电压不超过1000V的交流电力系统中&#xff0c;用于接受和分配电能&#xff0c;控制、保护和监测电路的装置。低压配电柜广泛应用于工业、商业、住宅等领域&#xff0c;是电力系统的重要组成部分。 然而&#xff0c;低压配电柜也面临着来自外部和内…