Promise 串行调用面试题

最新看到一个比较有趣的面试题:

怎么串行执行 Promise ?

这里简单给大家介绍下解答。针对多个 Promise 方法,原生提供了 allrace 方法。但是,他们都不是串行执行。那应该如果执行串行方法?这里介绍两种写法:

递归执行

简单来说就是在 then 方法里面递归传递下一次异步方法: then(next())

function iteratorPromise(arr){

    (function iter(){
        if(arr.length)
            arr.shift()().then(iter)
    })()
}

let arr = [()=>{
    return new Promise(res=>{
        console.log("run", Date.now());
        res()
    })
},()=>{
    return new Promise(res=>{
        console.log("run", Date.now());
        res()
    })
},()=>{
    return new Promise(res=>{
        console.log("run", Date.now());
        res()
    })
}]

iteratorPromise(arr);

// output
run 1529918098567
run 1529918098568
run 1529918098569

循环调用

这种办法比较取巧,直接利用 Promise.resolve()。通过循环赋值,得到最终的结果。

function iteratorPromise(arr){

    let res = Promise.resolve();

    arr.forEach(fn=>{
        res = res.then(()=>fn()) // 关键是 res=res.then... 这个逻辑
    })
}

let arr = [()=>{
    return new Promise(res=>{
        setTimeout(()=>{
            console.log("run", Date.now());
            res()
        },1000)

    })
},()=>{
    return new Promise(res=>{
        setTimeout(()=>{
            console.log("run", Date.now());
            res()
        },1000)

    })
},()=>{
    return new Promise(res=>{
        setTimeout(()=>{
            console.log("run", Date.now());
            res()
        },1000)

    })
}]

iteratorPromise(arr);


// output
run 1529918643573
run 1529918644574
run 1529918645580

原文发布于微信公众号 - 前端小吉米(villainThr)

原文发表时间:2018-06-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏黑泽君的专栏

java中,方法参数是基本类型和引用类型的区别

当参数是基本类型时,在调用方法时将值传递到方法中,运行方法,运行结束方法退出,对原本main中定义的变量没有任何操作(方法中没有return)。即:此时只跟栈有...

1752
来自专栏听雨堂

JavaScript大略

 简介: javascript是一种基于对象和事件驱动并具有安全性能的脚本语言。 它是通过嵌入或调入在标准的HTML语言中实现的。 数据类型:   St...

18410
来自专栏运维小白

9.4sed(上)

sed工具 sed -n '5'p test.txt sed -n '1,5'p test.txt sed -n '1,$'p test.txt sed -n ...

1868
来自专栏Golang语言社区

厚土Go学习笔记 | 17. 结构体及用指针访问结构体

结构体是个很有用的东西,在用计算机语言描述现实世界里的东西时,不得不大量的使用它。把现实世界的某一样东西的各种属性,用一个一个的变量记录下来。 最简单的比如:平...

3498
来自专栏大愚Talk

Golang中函数传参存在引用传递吗?

官方文档已经明确说明:Go里边函数传参只有值传递一种方式,为了加强自己的理解,再来把每种传参方式进行一次梳理。

1682
来自专栏Golang语言社区

厚土Go学习笔记 | 09. 类型转换 与 类型推导

在Go语言中,不同类型的项之间赋值时,需要显式转换。 表达式 T(v) 将值 v 转换为类型 T 。 var i int = 42 var f float64 ...

36110
来自专栏C语言及其他语言

【编程经验】优秀题解

1) 定义一个字符指针数组,用来存放将要输入的各个字符串的指针(用动态内存分配开辟空间存放数组)

805
来自专栏finleyMa

说下js中的bind

bind的受体是对象,返回的是个新的函数。 我们知道this总是指向调用他的对象。但是有时候我们希望‘固化’这个this。 也就是无论怎么调用这个返回的函数...

6631
来自专栏java学习

java每日一练(2017/9/16)

本期题目 (单选题) 1、代码String str=”123456a”;int i=Integer.parseInt(str);会报异常的是() A java...

3818
来自专栏cs

python的顺序程序设计

赋值 同步赋值:变量1,变量2,....变量n=表达式1,表达式2,.....表达式n 同步赋值首先计算右边n个表达式的值,然后同时将表达式的值赋给左边的n...

4366

扫码关注云+社区

领取腾讯云代金券