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

相关文章

来自专栏小白客

Python基础学习-操作列表

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

2774
来自专栏Golang语言社区

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

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

35010
来自专栏杂文共赏

Go中没有按引用传递

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

1081
来自专栏阮一峰的网络日志

JavaScript 有多灵活?

JavaScript 是一种灵活的语言,表达力极强,我来举一个例子,保证让很多人大吃一惊。 本文受到了 Kyle Simpson 的文章《Iterating E...

3247
来自专栏鸿的学习笔记

Python漫谈

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

873
来自专栏python3

python3--元组(tuple),列表(list),字典dict,其它(for,enumerate,range)

元组被称为只读列表,即数据可以被查询,但不能被修改,所以,字符串的切片操作同样适用于元组

1281
来自专栏cs

python的顺序程序设计

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

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

【编程经验】优秀题解

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

685
来自专栏ccylovehs

JavaScript之深拷贝和浅拷贝

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

721
来自专栏大愚Talk

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

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

922

扫码关注云+社区