javascript - 调用promise API时如何有效地聚合数组?

标签 javascript arrays promise

我想执行一系列getData函数,但前提是要获取数据。然后,我需要将所有结果编译为成对的值数组以返回。

以下代码有效,但我需要对另外7个“if(card.x)...”做类似的处理
有什么更好的方法呢?

async function buildingCard(card) {
    let cardToCreate = []
    try {
        if (card.joke1) {
            // wixData.get returns a promise
            let joke = await wixData.get("jokes", card.joke1).then((results) => {
                cardToCreate.push({ "titleText1": results.title })
            })
        }
        if (card.quote1) {
            let quote = await wixData.get("quotes", card.quote1).then((results) => {
                cardToCreate.push({ "fancyText1": results.title })
            })
        }
        return cardToCreate

    } catch (error) {
        console.log("buildcard error: " + error);
        return error;
    }
} 

最佳答案

您在这里有三件事有所不同:

  • 您正在检查的属性的名称
  • 您传递的字符串get
  • 对象的result属性(这最后看起来很奇怪)

  • 您可以使用这些对象的值定义对象的数组,如下所示:
    let props = [
        {name: "joke1", key: "jokes", resultKey: "titleText1"},
        {name: "quote1", key: "quotes", resultKey: "fancyText1"},
        // ...
    ];
    

    然后,如果要并行查询,则可以使用Promise.all等待多个promise生效,然后从结果数组中推送条目:
    async function buildingCard(card) {
        // Define the stuff you'll do
        let props = [
            {name: "joke1", key: "jokes", resultKey: "titleText1"},
            {name: "quote1", key: "quotes", resultKey: "fancyText1"},
            // ...
        ];
        let cardToCreate = [];
        try {
            return Promise.all(props
                // Only the ones with values
                .filter(({name}) => card[name])
                // Map to the object to push
                .map(
                    ({name, key, resultKey}) =>
                    wixData.get(key).then(results => ({[resultKey]: results}))
                )
            );
        } catch (error) {
            console.log("buildcard error: " + error);
            return error;
        }
    }
    

    如果您想一次打一个电话,可以改用for-of循环:
    async function buildingCard(card) {
        // Define the stuff you'll do
        let props = [
            {name: "joke1", key: "jokes", resultKey: "titleText1"},
            {name: "quote1", key: "quotes", resultKey: "fancyText1"},
            // ...
        ];
        try {
            let cardToCreate = [];
            for (const {name, key, resultKey} of props) {
                if (card[name]) {
                    const results = await wixData.get(key);
                    cardToCreate.push({[resultKey]: results});
                }
            }
            return cardToCreate;
        } catch (error) {
            console.log("buildcard error: " + error);
            return error;
        }
    }
    

    关于javascript - 调用promise API时如何有效地聚合数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61544316/

    相关文章:

    javascript - 站点内的 UTC

    javascript - Deobfuscating Javascript - 如何替换随机变量名?

    c++ - 现在我们有了 std::array C 风格的数组还有什么用途?

    javascript - Firebase 查询后返回 Promise

    javascript - 如何嵌套 Promise(Promise.all 内的 Promise.all)

    javascript - 如何在就绪时设置间隔,在 textarea 焦点处停止,然后在 textarea focusout 处开始?

    javascript - jquery数组困惑

    java - 将某个数字移动到数组的前面(Java)

    angular - fromPromise 在 Observable 类型上不存在

    javascript - 未定义不是对象 - Angular $rootScope.user.userMessage