01-并行执行异步函数

文章介绍如何创建一个自定义函数arrayPromiseAll,处理异步函数数组,确保并行执行,成功时按顺序返回结果,失败时立即返回第一个失败原因。
摘要由CSDN通过智能技术生成

#题目描述#

给定一个异步函数数组 functions,返回一个新的 promise 对象 promise。数组中的每个函数都不接受参数并返回一个 promise。所有的 promise 都应该并行执行。

promise resolve 条件:
当所有从 functions 返回的 promise 都成功的并行解析时。promise 的解析值应该是一个按照它们在 functions 中的顺序排列的 promise 的解析值数组。promise 应该在数组中的所有异步函数并行执行完成时解析。

promise reject 条件:
当任何从 functions 返回的 promise 被拒绝时。promise 也会被拒绝,并返回第一个拒绝的原因。

请在不使用内置的 Promise.all 函数的情况下解决。

#示例# 

1、示例1

输入:functions = [
  () => new Promise(resolve => setTimeout(() => resolve(5), 200))
]
输出:{"t": 200, "resolved": [5]}
解释:
promiseAll(functions).then(console.log); // [5]

单个函数在 200 毫秒后以值 5 成功解析。

2、示例2

输入:functions = [
    () => new Promise(resolve => setTimeout(() => resolve(1), 200)), 
    () => new Promise((resolve, reject) => setTimeout(() => reject("Error"), 100))
]
输出:{"t": 100, "rejected": "Error"}
解释:由于其中一个 promise 被拒绝,返回的 promise 也在同一时间被拒绝并返回相同的错误。

3、示例3 

输入:functions = [
    () => new Promise(resolve => setTimeout(() => resolve(4), 50)), 
    () => new Promise(resolve => setTimeout(() => resolve(10), 150)), 
    () => new Promise(resolve => setTimeout(() => resolve(16), 100))
]
输出:{"t": 150, "resolved": [4, 10, 16]}
解释:所有的 promise 都成功执行。当最后一个 promise 被解析时,返回的 promise 也被解析了。

#提示# 

函数 functions 是一个返回 promise 的函数数组
1 <= functions.length <= 10

#题目解析# 

1、准入准出:定义一个函数promiseAll,当传入一个异步函数数组 functions,返回一个新的 promise 对象 promise。

/**
 * @param {Array<Function>} functions
 * @return {Promise<any>}
*/
var promiseAll = function (functions) {
    return new Promise((resolve, reject) => {
        // 代码实现
    })
};

2、 参数定义:functions是一个由Promise函数(不接受参数)组成的异步函数数组,所以都能通过promise.then() 、或await/async语法糖获取到执行的结果,且所有的Promise函数是并行执行,可以通过forEach循环调用

3、结果解析:

Promise resolve条件:定义一个成功返回值result,是一个所有解析值的数组,通过for循环或forEach函数进行循环执行functions数组里的异步函数,并且根据索引i进行解析值的数组赋值,promise().then(res => result[i] = res),如何判断数组中的所有异步函数并行执行完成:相当于所有的promise都通过then取到了对应的解析值,可以定义一个count,每成功解析一个promise做累加,判断count的值和functions的length值相等时则说明全部解析完成

Promise reject条件:通过.catch捕获到哪个promise执行被拒绝了,有一个被拒绝,整个Primise也都被拒绝,并且输出当前的拒绝对象,只要捕获到那个一个即为第一个

#答案解析# 

/**
 * @param {Array<Function>} functions
 * @return {Promise<any>}
 */
var promiseAll = async function (functions) {
    return new Promise((resolve, reject) => {
        const result = []
        let count = 0;
        functions.forEach(async (fn, i) => {
            try {
                result[i] = await fn();
                if (++count == functions.length) {
                    resolve(result)
                }
            } catch (err){
                reject(err)
            }
        })
    })
};
/**
 * @param {Array<Function>} functions
 * @return {Promise<any>}
 */
var promiseAll = function (functions) {
    return new Promise((resolve, reject) => {
        const result = []
        let count = 0;
        functions.forEach((fn, i) => {
            fn().then(res => {
                result[i] = res;
                if (++count == functions.length) {
                    resolve(result)
                }
            }).catch(reject)
        })
    })
};
/**
 * @param {Array<Function>} functions
 * @return {Promise<any>}
 */
var promiseAll = function (functions) {
    return new Promise((resolve, reject) => {
        const result = [];
        let count = 0;
        for (let i = 0; i < functions.length; i++) {
            const item =functions[i]
            item().then((res) => {
                result[i] = res;
                if (++count === functions.length) {
                    resolve(result);
                }
            }).catch(reject)
        }
    })
};
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前端-张冠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值