【问题标题】:Possible to use an Async call return value to show/hide an alert?可以使用异步调用返回值来显示/隐藏警报吗?
【发布时间】:2021-08-14 20:54:03
【问题描述】:

在此之前作为骗子关闭,我已经通过论坛上的许多项目没有回答我的问题,所以请阅读。

场景:用户点击一个按钮。 javascript 应该验证输入日期是否有效。如果它无效,请显示一个确认框,以便他们可以继续使用错误的日期到服务器进行数据库插入或更新,或者取消和编辑。

要进行日期验证,我需要调用一个网络方法。使用 ajax 调用,因为它是异步的,所以不会工作,因为它不等待 web 方法的结果。由于在声明时将变量设置为 false,因此“isdateValid”方法始终返回 false 并显示确认框,即使日期有效(web 方法返回 true)。我添加了一个回调函数来处理 webmethod 调用,但在 webmethod 返回之前,消息框已经显示给用户。我似乎可以使这个“工作”的唯一方法是将它作为同步调用而不是异步调用。除了使 async: false 之外,有没有办法让它“等待”?这确实是一个同步逻辑,但所有论坛帖子都说要避免使其同步,所以对想法持开放态度。

function buttonClick(){
     if (!isDateValid())
          //show the confirmation box
}

function isDateValid(){
      var isDateValid = false;
      //ajax call to webmethod
}

---更详细,尝试了我发现的各种东西......仍然不好。

用户点击“发布”按钮...检查日期是否有效,如果没有,显示消息框,他们可以继续发布或取消

function checkPostConfirmation() {
if (!checkDateValidation())
    //show confirmation box
else
   //do something different  
   //always comes here because it's not "waiting"
}

//this method doesnt actually "wait"
async function checkDateValidation() {
    let result = await isChequeDateInvalid();
    return result;
}

 async function isDateInvalid() {
    var isDateValid = false;
    var selectedDate = (date from control on the screen)

    var result = await $.ajax
        ({
            ...typical stuff
            async: true,
            success: function(msg) {
                    callback(msg.d);
                }
        });                
    }

    function callback(boolResult) {
        isDateValid = boolResult;
    }

    return isDateValid;
}

【问题讨论】:

  • “我已经浏览了论坛上的许多项目” - 链接它们,展示你的尝试 - 支持你的主张。
  • 所以取消表单提交,调用,如果成功,用JavaScript重新提交表单。
  • 这与简单的 js 异步方法问题有何不同?你也试过回调吗?
  • ...当您这样做时,请查看SO's "How to ask" FAQ,其中“搜索和研究...并跟踪您发现的内容。” i> 在第一段,"Create a Minimal, Complete, and Verifiable example." 仅在后面几段。
  • 您不能使用期望 true 或 false 的 asp.net 按钮(并且 true 意味着运行服务器端代码)。您的按钮代码必须调用 js 代码。然后根据js代码的结果,就可以调用后面的服务端代码了。您不能将函数直接绑定或绑定到现有的 asp.net 按钮,该按钮期望基于 ajax 调用返回 true/false。您可以使用 style="display"none" 隐藏按钮,然后添加一个新按钮。单击该按钮时不会运行服务器端代码并​​且没有服务器端事件代码存根。单击该按钮时会调用 js 代码.

标签: javascript asp.net ajax boolean


【解决方案1】:

你可以试试 Javascript async/await,

function buttonClick(){
          isDateValid()
                  .then(result => {
                       if (!result)
                           //show the confirmation box
                   })
                  .catch(err => //handle error);
     
}

async function isDateValid(){
      var isValid = false;
      //ajax call to webmethod with await keyword
      isValid = await fetch(url);
      return isValid;
}

【讨论】:

  • isDateValid 如何返回?我认为这就是 OP 的要求。
  • ajax 调用返回应该设置它,我更新了我的代码。
  • Rajdeep Debnath - 感谢您的评论。我不认为我可以使用你的代码作为我的 buttonClick 函数不能是异步的,因为它会提交并将内容发送到服务器。
  • @user3242116 我已经更新了代码并使其基于承诺,请检查
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2015-04-08
  • 1970-01-01
  • 2019-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多