【问题标题】:What is the syntax error in my javaScript code? [duplicate]我的 JavaScript 代码中的语法错误是什么? [复制]
【发布时间】:2019-10-28 14:25:47
【问题描述】:

我有一个调用异步函数并将结果存储在数组中的 javascript 函数。我在函数的第 8 行收到语法错误。错误:“参数列表后未捕获的 SyntaxError:缺少)”。我在函数中看不到任何括号问题。如果有人看到任何错误,请指出?

    async function ProcessWorkItem(workItems) {
        var tempData = [];
        workItems.relations.forEach(function(relation){
            if (relation.rel.includes("Forward")) {
                //console.log(i);
                var split = relation.url.split("/");                            
                var childId = split[split.length-1];
                tempData.push(await getChildWorkItem(childId));
            } 
        });
        console.log(tempData);
        return Promise.all(tempData)
    }

【问题讨论】:

    标签: javascript function foreach async-await


    【解决方案1】:

    await 只能用于异步函数。 forEach 中的内部函数应该是异步的。或者您可以完全删除 async/await 并将 Promises 传递给数组:

        function ProcessWorkItem(workItems) {
            var tempData = workItems.relations.map(function(relation){
                if (relation.rel.includes("Forward")) {
                    //console.log(i);
                    var split = relation.url.split("/");                            
                    var childId = split[split.length-1];
                    return getChildWorkItem(childId);
                } 
            });
            console.log(tempData);
            return Promise.all(tempData)
        }
    

    【讨论】:

    • 那行不通。 forEach 循环将触发异步函数,然后 return Promise.all(tempData) 将在任何异步函数解析之前运行并将任何数据放入 tempData。
    • @Quentin,感谢您指出问题。我可能已经修好了。
    • 我不知道你为什么要在这里创建一个额外的承诺。不需要async 或await
    • 嗯。实际上,如果getChildWorkItem返回promise,可以直接传给数组,也可以传给Promise.all。删除了内部async/await。
    • @ZankhanaRana — 如果您需要串行而不是并行运行它们(注意您似乎没有在代码中将数据从一个传递到另一个),那么您需要使用常规 for 循环,而不是 forEach 或 map。
    【解决方案2】:

    你不能在非异步函数中使用 await

    包含 await 的函数(forEach 回调函数)不是异步函数

    这是更新后的功能

     async function ProcessWorkItem(workItems){
        var tempData = [];
        var relations = workItems.relations;
        var relationNum = relations.length;
        for(var i = 0; i < relationNum; i++){
           var relation = relations[i]
          if (relation.rel.includes("Forward")) {
           var split = relation.split("/");
           var childId = split[split.length-1];
           tempData.push(getChildWorkItem(childId));
          }
        }
        console.log(tempData);
        return Promise.all(tempData);
    
    })
    
    }
    

    【讨论】:

    • 那行不通。 forEach 循环将触发异步函数,但它不会等待它们解决,然后继续下一行(预计将填充 tempData)。
    • 哦,我明白了。是的,我错过了。我正在努力让你知道。但是,错误不会是您不能在异步函数中等待吗?为什么我会看到缺少的 ')' 语法错误?
    • 我稍微修改了代码。我在 foreach 函数中添加了 async 关键字。而不是使用 tempData,我正在更新一个全局变量。这似乎解决了语法错误。但我不确定它是否返回正确的输出。我正在检查
    • @ZankhanaRana — await 是第一个参数。在第一个参数之后,您需要 ,(然后是下一个参数)或 )(结束参数)。你不应该接受这个。它不能解决你的问题。这让事情变得更糟。
    • @ZankhanaRana — 阅读有关 Nina Lisitsinskaya 答案的评论主题可能会有所帮助(请注意,他们在我发表第一条评论后对其进行了修复,并在第二条评论后对其进行了改进)
    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-06-03
    • 2015-10-17
    • 2021-10-28
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多