前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >什么是Promise串行

什么是Promise串行

作者头像
用户1687375
发布于 2020-02-25 02:28:10
发布于 2020-02-25 02:28:10
1.1K00
代码可运行
举报
文章被收录于专栏:较真的前端较真的前端
运行总次数:0
代码可运行

什么是Promise串行

Promise串行是指每一个由promise封装的任务都顺序执行,即上一个执行完成后再执行下一个。

执行过程大致是下面的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Task A | ------>|
Task B |         ------>|
Task C |                 ------>|
Task D |                         ------>|

为什么要讲Promise串行

我们平时会比较多的使用并行,即多个任务一起执行,也就是利用Promise.all()。但其实在日常开发中串行也是会遇到的,比如依次开启走廊的所有灯,或者其次让喷泉的水枪依次喷水等等。但是ES6中的Promise并没有对串行进行直接封装,所以需要我们自己来做。

img

分布讲解Promise串行

Promise串行习题

之前有小伙伴发给过我一道这样的面试题,所以本文准备通过这道题来实现一下Promise串行。

定义 type Task = () => Promise (即 Task 是一个 类型,是一个返回值是 Promise 的函数类型) 假设有一个数组 tasks: Task[](每一项都是一个 Task 类型的数组) 实现一个方法 function execute(tasks: Task[]): Promise,该方法将 tasks 内的任务 依次 执行,并返回一个结果为数组的 Promise ,该数组包含任务执行结果(以执行顺序排序) 要求:忽略异常任务,并在结果数组中用 null 占位 限制:不添加任何依赖,仅使用 Promise,不使用 Generator 或 async

如果允许使用Generator或者async/await来写的话,会很简单,文章末尾再实现async/await的方法。

先做完成一下测试用例的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const Task = (result, isSuccess = true) => {
  return () => new Promise((resolve, reject) => {
    setTimeout(() => {
      if (isSuccess) {
        console.log(`success: ${result}`);
        resolve(result);
      } else {
        console.log(`error: ${result}`);
        reject(result);
      }
    }, 1000);
  });
}


execute([
  Task('A'),
  Task('B'),
  Task('X', false),
  Task('C'),
]).then(resultList => {
  // 这里期望打印 ["A", "B", null, "C"]
  console.log(resultList)
})

思路大致如下图:先做一个Promise实例,然后把每个Task循环的放置到上一个promisethen回调里。

需要注意的几点:

  1. 无论每个Task是成功还是失败,它都不能阻断下一个Task的执行
  2. 最后的then需要把每个Task的执行结果"决议"出去

对策:

  1. 每一个Task外层包装一层Promise,捕获Task的reject状态
  2. 可以利用一个中间变量,缓存所有Task的输出结果,然后在最后一个Promise的then里把中间变量“决议”出去

第一版代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function execute(tasks) {
    let resultList = [];
  return tasks.reduce(
    (previousPromise, currentPromise) => previousPromise.then((resultList) => {
    return new Promise(resolve => {
      currentPromise().then(result => {
                resultList.push(result);
        resolve()
      }).catch(() => {
                  resultList.push(null);
              resolve(resultList.concat(null))
      })
    })
  }),
    Promise.resolve()
  ).then(() => resultList);
}

改进

其实Promise的链式操作是可以传递值的,所以可以利用这个特性,省去中间变量,

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function execute(tasks) {
  return tasks.reduce(
    (previousPromise, currentPromise) => previousPromise.then((resultList) => {
    return new Promise(resolve => {
      currentPromise().then(result => {
        resolve(resultList.concat(result))
      }).catch(() => {
        resolve(resultList.concat(null))
      })
    })
  }),
    Promise.resolve([])
  )
}

aysnc/await版本

代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const execute = async (tasks = []) => { 
  const resultList = [];
  for(task of tasks) {
    try {
      resultList.push(await task());
    } catch (e) {
      resultList.push(null);
    }
  }
  return resultList; 
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-02-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 较真的前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Uniswap V3 释疑: 集中流动性, 无常损失和滑点
Uniswap 协议是一组原生的 ETH 的智能合约,它可以实现 ERC20 代币与 ERC20 代币的交换, 以及 ERC20 代币与 ETH 之间的的交换。
Tiny熊
2023/01/09
2K0
如何理解Uniswap v3 流动性头寸的价值
请跳到此系列文章的_part 1_[4] 和 _part 2_[5] , 您可以学习到为何 Uniswap v3 流动性代币[译者注:即头寸]为何类似于看涨期权空头和看跌期权空头[的组合,译者注]
Tiny熊
2023/01/09
1K0
如何理解Uniswap v3 流动性头寸的价值
uniswap的工作原理(下)
市场价格=池子里DAI的数量/池子里ETH的数量(P市场=X/Y)。假设市场数量趋近于无穷大,兑换价格无限趋近于X/Y
用户7976544
2020/11/14
2.6K1
uniswap的工作原理(下)
解读Dex中的无常损失:原理,机制,公式推导
本文源于十四正在撰写的《UniSwap从V1到V3的去中心化交易所之路》中用作资料援引,也发现市面文章的推导公式都颇为复杂,且重要逻辑转换缺乏描述,而无常损失又是Dex中AMM的重要部分,故单独成文。
十四君
2023/02/20
7900
解读Dex中的无常损失:原理,机制,公式推导
Raydium 协议
在不到一年的时间里,我们已经看到去中心化金融 (DeFi) 从一个流行词发展成为一个完整的生态系统,为个人财务自主权和信任设定了新的标准。DeFi 体现了去中心化和加密货币的一切。它允许每个人访问传统上属于大型银行、企业、风险基金和贸易公司领域的工具,而不会牺牲自主权。
公众号---人生代码
2021/09/18
7270
Raydium 协议
一文讲清-NFT市场新秀SudoSwap的AMM机制-创新挑战与局限
NFT交易市场的近期颓势频现,整个市场的流动性大幅降低,而此时8月异军突起的SudoSwap则凭借一超多强的增长数据,让基于AMM机制的交易市场映入大众视野。
十四君
2023/02/20
7520
一文讲清-NFT市场新秀SudoSwap的AMM机制-创新挑战与局限
如何在合约中集成 Uniswap v3
如果你还不熟悉Uniswap[4],它是一个去中心化的交易所(DEX),依靠外部流动性提供者将代币添加到流动池配对中,用户可以直接交易这些代币。
Tiny熊
2021/06/10
2.4K0
如何在合约中集成 Uniswap v3
采用延时喂价还被黑?Warp Finance 被黑详解
2020 年 12 月 18 日,据慢雾区情报 DeFi 项目 Warp Finance 遭受闪电贷攻击。以下是慢雾安全团队对整个攻击流程的详细分析。
辞令
2020/12/22
8470
采用延时喂价还被黑?Warp Finance 被黑详解
从ArtexSwap看Dex的另一种架构
ArtexSwap 是一个去中心化交易所,通过使用Artela EVM++和Aspect技术,去解决MEV风险和Rug Pull问题,提升了交易安全性和效率,适用于需要高安全性和灵活性的去中心化交易场景。
十四君
2024/07/12
1740
从ArtexSwap看Dex的另一种架构
Tokenlon协议初步介绍
Tokenlon是基于以太坊的去中心化交易所,实现了0x协议,提供链下订单簿,链上结算的功能;报价模型采用传统的柜台报价模式(RFQ/RFS)。
路之遥
2022/09/26
5710
剖析DeFi交易产品之UniswapV3:概述篇
UniswapV3 于 2021 年 5 月上线,相比 UniswapV2,改动很大,也变得复杂很多,最主要的有以下这几点改动:
Keegan小钢
2023/11/07
7180
剖析DeFi交易产品之UniswapV3:概述篇
defi 去中心化金融
想象一下,有个大学时的朋友联络你说:「嘿,我有个商业设想。我想开发一个做市机器人。不管谁来询价,我随时都能报出一个价格,我的定价算法会用 x * y = k。差不多就这些。想投资吗?」
公众号---人生代码
2020/08/05
6240
defi 去中心化金融
UniswapX研报(上):总结V1-3发展链路,解读下一代 DEX的原理创新与挑战
鲜有一个协议的问世,能彻底改变一个链上生态的格局,uniswapV1是一个而uniswapX又是一个。
十四君
2023/09/01
5200
UniswapX研报(上):总结V1-3发展链路,解读下一代 DEX的原理创新与挑战
如何对接 Uniswap V2 兑换代币
在上一篇文章中,我们通过 大概 100 行代码,了解了 Uniswap 的运行原理。
Tiny熊
2022/11/07
1.5K0
如何对接 Uniswap V2 兑换代币
使用Uniswap V2部署自己的去中心化交易所
Dapp链接:https://www.chainpip.com/dapp-view/6724
fingernft
2022/10/24
1.4K0
使用Uniswap V2部署自己的去中心化交易所
HFT系列:基于限价订单薄(LOB)失衡的量化策略研究与工具
充分了解限价订单薄(LOB)的运行动态是获得交易优势的一种可行的方式。LOB是未完成订单的记录,是大多数现代交易所的核心。在这样一个熙熙攘攘的市场,买家和卖家不断调整他们的出价和报价,以应对市场的涨落。
量化投资与机器学习微信公众号
2023/09/05
1.1K0
HFT系列:基于限价订单薄(LOB)失衡的量化策略研究与工具
Sushiswap 和 SUSHI 指南
Sushiswap最初是去中心化交易所 Uniswap 的社区分支,它使用恒定总和自动做市商 (AMM) 而不是传统的订单簿系统。
公众号---人生代码
2021/10/12
1.3K0
Sushiswap 和 SUSHI 指南
剖析DeFi交易产品之Uniswap:V2上篇
在 DeFi 赛道中,DEX 无疑是最核心的一块,而 Uniswap 又是整个 DEX 领域中的龙头,如 SushiSwap、PancakeSwap 等都是 Fork 了 Uniswap 的。虽然网上关于 Uniswap 的文章已经挺多,但大多都只是从机制上进行介绍,很少谈及具体实现,也存在一些问题没能解答,比如:手续费分配是如何实现的?最优路径是如何得出的?TWAP 怎么用?注入流动性时返回多少 LP Token 是如何计算的?因此,我从代码层面去剖析 Uniswap,搞清楚这些问题,同时也对 Uniswap 从整体到细节都有所理解。
Keegan小钢
2021/08/20
1.7K0
聊聊DeFi应用架构设计之道
DeFi 应用跟传统应用的差异性还是比较大的,商业模式不同,产品模型也不同,就连落地实现的技术栈也有很大不同。一般,传统应用也称为 Web2 应用,而 DeFi 应用则可被归入 Web3 之列。
Keegan小钢
2022/03/04
9380
聊聊DeFi应用架构设计之道
Uniswap v3 DPI-ETH 流动性挖矿计划即将推出!
地点:Uniswap V3 对:DPI — ETH 费用等级(必须使用此费用等级):0.3% 矿池 ID:0x9359c87B38DD25192c5f2b07b351ac91C90E6ca7 持续时间:太平洋标准时间 8 月 20 日下午 2 点, 奖励代币INDEX2ST 0月 2 日下午
公众号---人生代码
2021/10/12
8170
Uniswap v3 DPI-ETH 流动性挖矿计划即将推出!
推荐阅读
相关推荐
Uniswap V3 释疑: 集中流动性, 无常损失和滑点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档