首页 > 编程语言 >c++ 简单模拟js Promise

c++ 简单模拟js Promise

时间:2023-09-21 09:45:25浏览次数:44  
标签:call cb void c++ js PROMISE Promise include

main:

#include <stdio.h>
#include "common.h"
#include "promise.h"
#include <chrono>   // std::chrono::seconds
#include <thread>   // std::this_thread::sleep_for


int main(void) {
    Promise* pro = new Promise([](call resolve, call reject) -> void {
        std::this_thread::sleep_for(std::chrono::seconds(3));
        resolve();
        });
    
    cout << "start " << endl;

    pro->then([]()->void {
        cout << "then1" << endl;
        })->then([]()->void {
            cout << "then2" << endl;
            });


    return 0;
}

promise.h:

#pragma once
#ifndef PROMISE
#define PROMISE 1

#include <string>
#include <iostream>
#include <functional>

using namespace std;

#define PROMISE_REJECTED 0
#define PROMISE_PENDING 1
#define PROMISE_FULLFILLED 2

//typedef void (*call)();
typedef function<void()> call;

class Promise
{
private:
    char state = 1; // 0->failed   1->pending   2->success
    string msg;
    void(*successCallback)();
    void(*failedCallback)();

public:
    Promise(void callable(call, call));
    Promise* resolve();
    Promise* reject();
    Promise* then(void(*cb)());
    Promise* error(void(*cb)());
};


#endif // !PROMISE

promise.cpp:

#include "promise.h"

Promise* Promise::resolve() {
    this->successCallback();
    this->state = PROMISE_FULLFILLED;
    return this;
}


Promise* Promise::reject() {
    this->failedCallback();
    this->state = PROMISE_REJECTED;
    return this;
}


Promise::Promise(void callable(call, call)) {
    this->state = PROMISE_PENDING;
    this->successCallback = []()->void {};
    this->failedCallback = []()->void {};
    try {
    callable([=]()->void {
        this->resolve();
        }, [=]()->void {
            this->reject();
        });
    }
    catch (bad_exception e) {
        this->reject();
    }

}

Promise* Promise::then(void(*cb)()) {
    if (this->state == PROMISE_FULLFILLED) {
        cb();
        return this;
    }
    this->successCallback = cb;
    return this;
}

Promise* Promise::error(void(*cb)()) {
    if (this->state == PROMISE_REJECTED) {
        cb();
        return this;
    }
    this->failedCallback = cb;
    return this;
}

 

标签:call,cb,void,c++,js,PROMISE,Promise,include
From: https://www.cnblogs.com/laremehpe/p/17719143.html

相关文章

  • Node.js 20 —— 几个令人大开眼界的特性
    前言:欢迎来到Node.js20Node.js20已经发布,带来了创新和激动人心的新时代。这个开创性的版本于2023年4月18日首次亮相,并将在2023年10月发布长期支持(LTS)版本,并且将持续支持至2026年4月,下面小编就为大家介绍一下Node.js20的几个新特性:1.Node.js权限访问Node.js20正式推出了......
  • js解密日记3 jsentrypt带给我的困扰
    随着技术的不断进步,保护敏感数据已成为开发者的首要任务之一。加密是一种保护数据的方法,JSenCrypt是一款流行的加密库,提供了HTML、Python和Node.js版本。本文将探讨每个版本的特点、优点、缺点,并提供代码示例来演示它们的用法。jsentryptHTML版本优点:客户端加密:jsentrypt......
  • C++ 程序员入门需要多久,怎样才能学好?
    学习成为一名熟练的C++程序员需要时间和努力,具体的时间取决于个人的学习速度、学习方法和学习目标。以下是一些建议,以帮助您入门并学好C++:基础知识学习(数周至数月):开始学习C++的基础语法,包括变量、数据类型、运算符、控制流程(如条件语句和循环)、函数等。学习C++标准库,包括常用的容器......
  • 一文彻底搞懂JS函数柯里化
    函数柯里化是一种强大的函数式编程技术,它使我们能够预设函数的参数,创建新的函数,并在需要的时候执行这些函数。这个技术提供了强大的代码复用和组合能力,使我们的代码变得更简洁、更具可读性。什么是函数柯里化?函数柯里化(Currying)是在函数式编程中常用的技术,它的基本思想是将......
  • C++ 左/右值及其引用 论述
    说明:本文探讨的是C++11以来的值类别关于左值和右值,在不对其进行详细的划分时,简单的分类方法包括左值持久,右值短暂能取得地址得通常是左值,反之通常是右值(这一方法启示我们一个表达式的类型与其是左值还是右值无关,即相同类型的表达式既可以是左值也可以是右值)右......
  • delphi JSON序列化(四)
    {TDateTimeConverter}functionTDateTimeConverter.CanConvert(ATypeInf:PTypeInfo):Boolean;beginResult:=True;end;functionTDateTimeConverter.ReadJson(constAReader:TJsonReader;ATypeInf:PTypeInfo;constAExistingValue:TValue;constASerial......
  • C++中的四种类型转换运算符
    隐式类型转换是安全的,显式类型转换是有风险的,C语言之所以增加强制类型转换的语法,就是为了强调风险,让程序员意识到自己在做什么。但是,这种强调风险的方式还是比较粗放,粒度比较大,它并没有表明存在什么风险,风险程度如何。再者,C风格的强制类型转换统一使用(),而()在代码中随处可见,所以......
  • 使用js开发一个快速打开前端项目的alfred插件
    使用js开发一个快速打开前端项目的插件目录前言使用的技术栈步骤问题发现待优化前言一直以来开发都是先打开vscode,然后选择项目,在项目多的情况下会觉得挺繁琐;如果同时打开了许多vscode窗口,寻找目标窗口也比较麻烦,于是萌生了开发一个alfred的工作流插件的想法,目标是在alf......
  • Three.js中实现对InstanceMesh的碰撞检测
    1.概述之前的文章提到,在Three.js中使用InstanceMesh来实现性能优化,可以实现单个Mesh的拾取功能那,能不能实现碰撞检测呢?肯定是可以的,不过Three.js中并没有直接的API可以实现对InstanceMesh的碰撞检测,需要手动实现回顾本文的描述的Three.js的场景前提:使用InstanceMesh来构建数......
  • c++ 访问全局变量
      #include<iostream>usingnamespacestd;inta{1};intmain(){inta{123};cout<<"外部的a:"<<a<<endl;//外部的a:123{cout<<"外部的a:"<<a<<endl;//外部的a:123......