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 条评论
登录 后参与评论

相关文章

来自专栏cs

python的顺序程序设计

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

3816
来自专栏Golang语言社区

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

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

35410
来自专栏青玉伏案

窥探Swift之函数与闭包的应用实例

今天的博客算是比较基础的,还是那句话,基础这东西在什么时候都是最重要的。说到函数,只要是写过程序就肯定知道函数是怎么回事,今天就来讨论一下Swift中的函数的特...

1905
来自专栏运维小白

9.4sed(上)

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

1798
来自专栏鸿的学习笔记

Python漫谈

列表切片的标准是lst[a:b:c] a是列表切片的开头,b是切片的结尾,c是step。 这里的表示从第一个元素开始,按照每隔一步,到第三个元素结束

933
来自专栏杂文共赏

Go中没有按引用传递

在Go中两个变量共享同一块内存区域是不可能的。但是两个变量指向的实际存储位置是可以一样的,但这不同于两个变量共享相同的存储区域。

1341
来自专栏一个爱吃西瓜的程序员

Python基础学习-操作列表

一 :遍历整个列表 1:使用for循环来遍历列表: 例: ? 输出: ? 二:避免缩进错误 1:Python根据缩进来判断代码行与前一个代码行的关系。 2:...

2814
来自专栏黑泽君的专栏

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

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

1222
来自专栏深度学习与计算机视觉

C++ 指针常量与常量指针

吐槽一下: 指针常量与常量指针的翻译就好比机器学习中Regularization翻译成正则化一样,讲真,正则化这个说法确实要比规则化显得高端些,但是到了理解...

2327
来自专栏ccylovehs

JavaScript之深拷贝和浅拷贝

工作中会经常遇到操作数组、对象的情况,你肯定会将原数组、对象进行‘备份’ 当真正对其操作时发现备份的也发生改变,此时你一脸懵逼,到时是为啥,不是已经备份了么,怎...

941

扫码关注云+社区