【问题标题】:Accessing javascript variables set in Callback function of a PageMethod call访问在 PageMethod 调用的回调函数中设置的 javascript 变量
【发布时间】:2011-04-19 15:51:20
【问题描述】:

在单击事件中,我调用了一个 PageMethods 请求,该请求包含两个回调函数:OnServerValidationSuccess 和 OnServerValidationFailure。我也尝试设置创建一个名为clientResult的对象;

    var clientResult = { rc: "", msg: "" };

    $('#btnSave').click( function () {
        PageMethods.ServerValidateCreateCompany(companyName, domainName, country, OnServerValidationSuccess, OnServerValidationFailure);
        alert(clientResult.rc); //this is null!
});

在 OnServerValidationSuccess 中,结果参数包含异步响应。在那里我尝试将其分配给clientResult

//On Success callback
function OnServerValidationSuccess(result, userContext, methodName) {
    clientResult = result;
    if (clientResult.msg.length != 0) {
        document.getElementById('resMsg').innerHTML = clientResult.msg;
        $('#resMsg').addClass('warning');
    }
}

我将result 分配给回调函数中的本地clientResult 变量。它应该包含完整的服务器响应,由服务器端 WebMethod 正确发送。 但是,在调用 PageMethod 后它仍然为 null 或空。 我必须做什么才能将回调中设置的变量分配给局部变量以便我可以访问它?

【问题讨论】:

  • 您的 PageMethod 是什么样的?没有看到就很难说。
  • 在旁注中,我主张在 PageMethod 上使用 HttpHandler。与使用 Page 相比,开销会少很多。

标签: javascript callback scope pagemethods


【解决方案1】:

您似乎正确地将值分配给clientResult,只是您访问它太早了。

您正在进行异步/非阻塞调用,这意味着它会立即返回,但会继续在后台工作。因此,您的 JavaScript 会立即从对 PageMethods.ServerValidateCreateCompany 的调用中返回并转到 alert。但是您的请求还没有来得及完成,而且您的成功回调 (OnServerValidationSuccess) 甚至还没有运行,所以您得到了 undefinednull

您应该调用将要处理响应的任何函数OnServerValidationSuccess 函数中将接收响应。也许是这样的(您似乎已经在使用msg 做某事,只需将您的工作与rc 一起移到此处)

//On Success callback
function OnServerValidationSuccess(result, userContext, methodName) {
    clientResult = result;
    alert(clientResult.rc); //this will work
    process(clientResult); //process the response here
    if (clientResult.msg.length != 0) {
        document.getElementById('resMsg').innerHTML = clientResult.msg;
        $('#resMsg').addClass('warning');
    }
}

【讨论】:

  • 谢谢。我没有在OnServerValidationSuccess 中完成所有处理的原因是因为PageMethod 在单击事件处理程序中被调用,并且响应包含有条件地返回真/假以进行表单验证和提交的逻辑。这就是为什么我需要在回调方法之外创建clientResult 变量的范围。
  • 我不太清楚,clientResult的范围还是和以前一样,只是在不同的地方访问了。
  • 我想我知道您需要什么 - 您想提交/取消表单的提交,具体取决于服务器是否表示条目有效并且您想使用 clientResult.rc 值作为检查。在我的脑海中,您可能会强制请求同步,但通常不建议这样做,因为它会导致您的页面锁定,直到响应返回。
  • 你是对的,同步是要走的路。我放弃了使用 PageMethods,因为它默认是异步的,并且这种行为不能被覆盖。所以我使用了更低级别的jquery $.ajax(),并将'async'属性分配给false。此外,它不会在补丁程序中注入大量不需要的脚本渣滓以使其正常工作。 jquery 再次拯救了这一天!
  • 我的意思是写“注入页面”而不是“注入补丁”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 2013-04-24
相关资源
最近更新 更多