Promise 一个基于协程下的任务队列状态管理任务包 解决复杂的异步转同步问题

news2025/1/12 8:48:56

前言

一直都想写关于Promise的东西,Promise解决的问题特别多,而普通前端就把这东西结合ajax来做一个await request() ,如果仅仅作为这样一种东西使用那就太可惜了。

它是队列的任务包

前端同学应该是没听说过队列,但是大前端同学,例如搞安卓的或者IOS的肯定听过,在安卓开发种,所有的UI操作都需要给主进程处理,这里的new Runnable() 就很像Promise

安卓里面的线程子类

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private TextView textView;
    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        textView = findViewById(R.id.textView);
        handler = new Handler(Looper.getMainLooper());

        // 启动一个子线程
        new Thread(new Runnable() {
            @Override
            public void run() {
                // 模拟一些后台工作
                try {
                    Thread.sleep(2000); // 模拟耗时操作
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                // 更新UI,必须在主线程中进行
                handler.post(new Runnable() {
                    @Override
                    public void run() {
                        textView.setText("更新后的文本");
                    }
                });
            }
        }).start();
    }
}

Python 协程中的Future

import asyncio

def async_task(future, success=True):
    async def task():
        await asyncio.sleep(2)
        if success:
            future.set_result("Task completed successfully")
        else:
            future.set_exception(ValueError("Something went wrong"))
    return task()

def success_callback(result):
    print(f"Success: {result}")

def error_callback(error):
    print(f"Error: {error}")

async def main():
    future = asyncio.Future()
    
    # 启动异步任务
    asyncio.create_task(async_task(future))
    
    # 注册成功和错误回调
    future.add_done_callback(lambda f: success_callback(f.result()) if not f.exception() else error_callback(f.exception()))
    
    # 等待 Future 完成
    await future

# 运行事件循环
asyncio.run(main())

Promise 的异步转同步操作

function updateDomElement(element, newValue) {
  return new Promise((resolve, reject) => {
    // 假设这里是一个异步的DOM更新操作
    element.textContent = newValue;

    // 模拟DOM更新完毕,触发一个自定义事件
    const event = new Event('domUpdated');
    setTimeout(() => {
      element.dispatchEvent(event);
    }, 1000); // 1秒后触发更新完成事件

    // 监听自定义事件,表示DOM更新完毕
    element.addEventListener('domUpdated', function onDomUpdated() {
      element.removeEventListener('domUpdated', onDomUpdated);
      resolve(true); // 触发Promise的resolve
    });

    // 如果有可能的错误情况,也可以调用reject(error)
  });
}

// 使用示例
async function performOperation() {
  const element = document.getElementById('myElement');
  
  // 更新DOM元素,并等待更新完成
  await updateDomElement(element, "New Content");

  // DOM更新完成后继续操作
  console.log("DOM updated successfully. Now performing next operations...");
  // 继续后续操作
}

performOperation();

创建一个Promise,直到有人调用了这个Promise.resolve()函数

只要你理解了上面任务包的概念之后,并且你知道只要有人调用了Promise.resolve()这个函数后,这个任务包就处理成功了,那么只要你创建了它,就相当于塞到了事件循环队列里去了。

await就是一个生产者,同时还把它下面的代码都自动封装成了回调函数,之后的就没有自己的故事了。

async 相当于一个消费者,负责等待任务逻辑调用这个Promise.resolve()函数,一旦有逻辑调用了Promise.resolve函数,就意味着这个Promise任务被处理完毕了,就可以开始它的后续回调了。

Promise都有哪些用途?

  1. 你试试用promise将websocket封装为一个await wsrequest(),这样能让你像调用http一样调用websocket,非常方便,怎么搞?

  2. https://blog.csdn.net/wangsenling/article/details/130224796icon-default.png?t=N7T8https://blog.csdn.net/wangsenling/article/details/130224796

  3. 插件与网页的异步通信,上面已有演示,通过事件的方式,来回倒腾,实现同步请求

  4. 谷歌插件inject注入脚本与content script基于Promise+async/await 同步通信实现过程_chrome plugin inject-CSDN博客文章浏览阅读1.1k次。因为webpage和contentscript是两个隔离环境,在webpage(普通网页)中有CSP安全机制,而在macm1环境,MV3版本下无法修改response.header这个bug半年前反馈给谷歌,后续也没见结果,所以,想在webpage网页中直接请求远程url是走不通的,只有借助contentscript来协助请求数据,但是这里牵涉到两个步骤,能否实现异步转同步方式来处理这个过程?_chrome plugin injecthttps://blog.csdn.net/wangsenling/article/details/129918148

  5. 网页UI的动画或者状态变化的后续操作,demo省略

  6. Electron中各种复杂调度下的异步转同步操作

总之把Promise运用在异步转同步的构建上,才能发挥出Promise存在的意义,可以理解为一切异步操作都可以用Promise来封装,实现完美的调度逻辑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2040155.html

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

相关文章

Kubernetes-K8S

Kubernetes由于单词太长,省略掉中间8个字母简称为K8S。它介于应用服务和服务器之间。能够通过策略协调和管理多个服务,只需要一个YAML文件配置。定义应用的部署顺序等信息,自动部署应用到各个服务器,还可以自动扩容缩容。 架构原理…

RabbitMQ实现多线程处理接收消息

前言:在使用RabbitListener注解来指定消费方法的时候,默认情况是单线程去监听队列,但是这个如果在高并发的场景中会出现很多个任务,但是每次只消费一个消息,就会很缓慢。单线程处理消息容易引起消息处理缓慢&#xff0…

前程无忧 阿里227滑块 分析

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!有相关问题请第一时间头像私信联系我删…

Qt下使用QtPdfium处理PDF文档

文章目录 前言一、使用QPdfDocument二、使用QtPdfium三、示例完整代码总结 前言 在我之前的文章中,有提到如何生成PDF,这个可以查看文末参考文章。如果要实现在Qt下进行PDF文档的处理(读取显示),可以使用自带的PDF库以…

Unity(2022.3.38LTS) - 基础概念

目录 一. 场景 二. 游戏对象 三. 组件 四. 标签 五. 静态游戏对象 六. 保存 一. 场景 Unity 场景是游戏或应用开发中的一个重要概念。 Unity 场景的组成元素: 它通常包含了各种游戏对象,比如 3D 模型、灯光、摄像机、脚本组件、音频源等等。 作用…

串列翼无人机技术详解

串列翼无人机作为一种特殊布局的飞行器,其概念可追溯至早期航空探索时期。随着航空技术的不断进步,尤其是复合材料、先进控制算法及动力系统的革新,串列翼无人机逐渐从理论走向实践。这一设计初衷在于通过前后两组机翼的巧妙布局,…

Redis Cluster集群

redis-cluster集群 Redis Cluster是Redis官方提供的分布式解决方案。当遇到内存、并发、流量等瓶颈时,就可以采用Cluster架构达到负载均衡目的。 1.Redis单实例主要有单点故障,容量有限,流量压力上限的问题。 Redis单点故障,可以…

全开源智慧停车场微信小程序源码/智能停车系统源码/停车自助缴费系统/停车场管理收费+物业管理+物联网+自助缴费功能

源码简介: 智慧停车场微信小程序源码,全开源智能停车系统源码,停车自助缴费系统,具有停车场管理、停车收费、物业管理、物联网、自助缴费等多种功能。 这是一个全开源的智能停车系统,功能强大。它不仅能帮你管理停车…

如何平衡冷数据(历史库)的成本与性能?| OceanBase应用实践

随着数据量的迅猛增长,企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升,以及数据运维复杂性的增加,这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战,对数据生命周期…

音频去噪:使用Python和FFT增强音质

根据定义,声音去噪是从音频信号中去除不需要的噪音或干扰,以提高其质量和清晰度的过程。这涉及识别和隔离噪音成分(通常以不规则或高频元素为特征),并将其过滤掉,同时保持原始声音的完整性。 声音去噪目标是改善聆听体验以及音频分析和处理的准确性。过滤掉噪音对于高保真音频…

SQL每日一练-0814

今日SQL题难度:★☆☆☆☆☆☆☆☆☆ 1、题目要求 找出每个部门中薪资最高的员工显示部门ID、部门名称、员工ID、员工姓名以及对应的薪资 2、表和虚拟数据 现有两个表:Employees 和 Departments,记录了员工和部门信息。 CREATE TA…

MySQL-进阶篇-索引

文章目录 1. 准备工作2. 索引概述2.1 什么是索引2.2 索引的优缺点 3. 索引的结构3.1 索引结构介绍3.2 二叉树3.3 BTree3.4 BTree3.5 MySQL 中的 BTree3.6 Hash3.7 思考题:为什么 InnoDB 存储引擎选择使用 BTree 索引结构 4. 索引的分类5. 索引的语法5.1 创建索引5.2…

html+css+js网页制作苹果助手pc1个页面(带js)

htmlcssjs网页制作苹果助手pc1个页面(带js) 网页作品代码简单,可使用任意HTML编辑软件(如:Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#x…

解决方案上新了丨趋动科技推出基于银河麒麟操作系统的异构算力池化解决方案

趋动科技携手麒麟软件打造基于银河麒麟操作系统的异构算力池化解决方案,共同探索AI领域新场景。 人工智能技术作为数字经济发展的重要推手,在各行业业务场景中落地需要大量AI算力资源的有效保障。在IT基础设施普遍云化的今天,AI算力一方面需…

【ai】Easy-RAG 不行啊,RAGFlow官方demo行

提取工程:graph-demo-ui.py 没有index.html 过不了。这俩可能是一样的 faiss db 看起来一直报错,txt 输入也不行。chroma 的问题是向量化ok,但是和大模型结合不行。easy-rag代码真不多 chroma db 下的操作 向量化竟然也成功了 问问题不行啊 /home/zhangb

Python 之Web应用开发(Flask框架)

一 Python 简介 1.1 Python是继C,java,C#等编程语言之后又一种面向对象的高级语言,凭借着简单的语法和和丰富的库,2015年开始迅速发展,到今天已成为排行前三的最受欢迎榜。 1.2 Python 应用领域非常广泛,…

华为的流程管理

华为建设流程体系始于2000年,那时华为公司面临着快速扩张和全球化发展的挑战,意识到传统的管理模式已经无法满足业务发展的需求。为了提高公司的管理效率和竞争优势,华为决定启动流程体系的建设。在建设过程中,华为借鉴了业界最佳…

SecureCRT for Mac/Win:安全高效的专业终端SSH工具软件

SecureCRT for Mac/Win是一款功能强大且安全可靠的专业终端SSH工具软件,专为网络管理人员、系统管理员和开发人员设计,旨在提供高效、安全的远程访问和管理解决方案。这款软件以其卓越的性能和丰富的功能,赢得了广泛的用户好评和信赖。 核心…

【Python机器学习】Apriori算法——使用APriori算法来发现频繁集

关联分析的目标包括两项:发现频繁项集和发现关联规则。首先需要找到频繁项集,然后才能获得关联规则。 APriori算法时发现频繁项集的一种方法。APriori算法的两个输入参数是最小支持度和数据集,算法首先会生成所有单个物品的项集列表&#xf…

【源码】Sharding-JDBC源码分析之Yaml分片配置原理(二)

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…