异步并行和顺序的通用 JS 函数

问题描述 投票:0回答:1

我正在寻找 2 个通用的、可重用的函数来处理并行和顺序标注。

目前,我们使用内联等待来处理顺序...

export async function init() {
   const results1 = await callout1();
   const results2 = await callout2();
}

...以及类似的东西来处理并行。

async function init() {
   const records = await this.loadRecords();
}

async function loadRecords(){
   const records = getRecords({recordId: this.recordId});
   const picklistOptions = getPicklistOptions();

   return {
      records: await records,
      picklistOptions: await picklistOptions
   }
}

我想要一些我们可以在任何地方使用的通用函数来传递一个函数数组,并让它为我们处理剩下的事情。我想过这样的事情,但我不知道如何分配和返回值。

import { asyncParallel, asyncSequential } from 'c/util';

async function init() {
   const records = await asyncParallel([getRecords(), getPicklistOptions()]);
   const records2 = await asyncSequential([getRecords(), getPicklistOptions()]);
}

async function asyncParallel(arrayFunctions) {
   return await Promise.all(arrayFunctions);
}

async function asyncSequential(arrayFunctions) {
   // I think this would just run in parallel because the for loop would just through the promise in the array
   let ret = [];
   for(const func of arrayFunctions){
      ret.push(await func);
   }
   return ret;
}

尽管如此,我觉得您唯一想要运行异步函数来顺序获取记录的情况是因为您需要从第一条记录中获取某些内容,然后才能进行第二次标注。因此,也许为此使用通用异步并没有帮助。但是,处理并行的通用函数将非常有益。

javascript asynchronous async-await salesforce lwc
1个回答
0
投票

并行使用:

const asyncParallel = (promises) => Promise.allSettled(promises);

如果您将使用

Promise.all(promises)
,如果任何承诺被拒绝,它将被拒绝。相反,您只需要使用
Promise.allSettled(promises)
,这将返回成功和失败的结果。

连续使用: 顺序承诺通常取决于前一个承诺,因此您可能不需要运行,您可以使用

.then
链接它们或像这样按顺序等待:

const result1 = await getPromise1();
const result2 = await  getPromise2(result1);

但是,如果你只想按顺序运行它们,而不管是否会出现错误,你可以编写这样的函数:

const asyncSequential = async (promises) => {
    const results = [];
    for (const promise of promises) {
        const result = {};
        try {
            result.value = await promise;
            result.status = 'fulfilled';
        }
        catch {
            result.status = 'rejected';
        }
        results.push(result);
    }
   
    return results;
}

这个函数是为了模仿 Promise.allSettled 结果,但是是并行的。

© www.soinside.com 2019 - 2024. All rights reserved.