在javascript onclick(或任何)事件上调用异步函数

Posted

技术标签:

【中文标题】在javascript onclick(或任何)事件上调用异步函数【英文标题】:Calling async function on javascript onclick (or any) events 【发布时间】:2020-04-04 18:18:18 【问题描述】:

我正在 js 中尝试 es6 以及 async/await。

我所做的是:

html代码

  <input type="button" onclick="javascript:examplefunction()" />

单独的example.js文件中的js代码,已经包含在html中。

  const somefunction = (...args) => 
    let result =  feedReducer(args);
    // do something
  

这个很好用。但是由于我必须将 await 用于其他一些函数,在 examplefunction() 中,我做了正常的箭头函数来异步,如下所示

   const somefunction = async (...args) => 
    let result = await feedReducer(args);
    // do something
  

现在我明白了

未捕获的语法错误:await 仅在异步函数中有效

我被困在这里,我做错了什么?我从here 中采用了上述语法。任何建议表示赞赏。谢谢。

实际功能:

    const preparationManager = async (...args) => 
        console.log(args.length);
        let feed_type = args[0], feed_id = args[1], feed_name = args[2], product_count = args[5];
        let index = args[7] | 0;
        jQuery("#loader").show();
        jQuery.ajax(
            url: 'index.php?option=com_cartproductfeed&task=tranquilizer.formatFeedsToParentChildJson',
            type: 'POST',
            dataType:'json',
            data: feed_type: feed_type, feed_id:feed_id, feed_name: feed_name, index:index ,
            success: function (res) 
                if(res.success === true)
                    if(res.do_repeat === true)
                        args.push(res.index);
                        preparationManager(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
                    else
                        console.log("feedreducer");
                        let result = await feedReducer(args, res);
                        console.log('result',result)
                        console.log("after result")
                    
                    //window.location.href = base_url + 'index.php/etsy-listings';
                else
                    console.log(res);
                
                jQuery("#loader").hide();
            
        )
    ;

    const feedReducer = async (...args) => 
        jQuery.ajax(
            url: 'index.php?option=com_cartproductfeed&task=tranquilizer.formatFeedsToParentChildJson',
            type: 'POST',
            dataType:'json',
            data: feed_type: feed_type, feed_id:feed_id, feed_name: feed_name, index:index ,
            success: function (res) 
                if(res.success === true)
                    if(res.do_repeat === true)
                        args.push(res.index);
                       let reducerPromise = feedReducer(args[0],args[1],args[2],args[3],args[4],args[5],args[6]);
                       console.log(reducerPromise);
                    else
                        //TODO : handle completion of feedreducer
                    
                    //window.location.href = base_url + 'index.php/etsy-listings';
                else
                    console.log(res);
                
                jQuery("#loader").hide();
            
        )
    ;

【问题讨论】:

您显示的代码不会产生上述错误。你能展示产生问题的实际代码吗?上面的示例令人困惑(函数名称并不完全匹配,例如 examplefunction 与 somefunction),并且它们不会重现问题。如果您不显示导致问题的代码,我们将无法真正帮助您。 P.S.你有什么理由还在 HTML 中使用古老的内联 onclick= 处理程序,而不是在 JS 中使用 addEventListener 的不显眼的处理程序? 你不能等待一个非异步且不返回承诺的函数。检查我的答案。 @ADyson 这个项目很旧,我没有改变惯例。我还添加了我的查询的实际代码,请看一下,谢谢。 谢谢大家,我终于报错了,我解决了,这是由于ajax中的成功函数回调。我们可以使用 await jQuery.ajax(); 来解决它 【参考方案1】:

嗨,Suz,试试下面对我有用的代码。

function feedReducer(args)
    return new Promise((res,rej)=>
    res(args);
  )


const somefunction = async (...args) => 
  let result = await feedReducer(args);
  console.log(result);
  // do something


somefunction('hello');

未捕获的语法错误:await 仅在异步函数中有效

您收到的上述错误表明您的 feedReducer 不是异步函数

确保 feedReducer 返回一个 Promise。祝你好运

【讨论】:

【参考方案2】:

使用

       document.getElementById("idButton").onclick=async ()=>
            // await promiseExample();
        ;

【讨论】:

以上是关于在javascript onclick(或任何)事件上调用异步函数的主要内容,如果未能解决你的问题,请参考以下文章

javascript onclick,匿名函数

为啥在 onclick 的值中使用任何其他词代替“javascript”时浏览器不会抛出错误?

Javascript事件

如何在jquery或javascript中设置函数调用的顺序或优先级?

使用带有jQuery或Javascript的按键触发“按钮onClick”

我可以使用onClick()事件吗?totags?