【问题标题】:PageMethod's onSuccess function not reached未达到 PageMethod 的 onSuccess 函数
【发布时间】:2018-08-24 02:01:46
【问题描述】:

我正在开发一个 asp.net 网络表单应用程序。在客户端,我有一个 javascript for 循环,它在代码隐藏中调用 PageMethod。如果 PageMethod 成功执行,我必须执行附加的 javascript 功能,例如更新标签的值。问题是当for 循环运行并调用PageMethod 时,它永远不会转到onSuccess 方法。循环只是继续并结束。我想知道如何在每个 PageMethod 调用之后调用 onSuccess 方法,然后循环继续进行下一次迭代。以下是我的代码 sn-p。

for (var i = 0; i < data.length; i++) {
    var dataItem = datata[i];
    var name = dataItem.name;
    if (name !== null && name !== '') {
        PageMethods.ProcessName(name, onSuccess);
        function onSuccess(result) {
            if (result == "") {
                // code to populate a label with the value of name 
                // in each iteration
            }                       
        }
    }
}

【问题讨论】:

  • 为什么一定要在循环内定义onSuccess函数?还有,调用onSuccessresult参数的值是多少?
  • 如果 PageMethod 有错误,结果会有一些价值。如果我将 onSuccess 函数移到 for 循环之外,它会调用循环执行的次数。问题是我必须为每次迭代获取“名称”值。但是,onSuccess 在循环之外,我只得到最后一次迭代的“名称”值!
  • 这是从循环中调用异步方法的常见且经过充分讨论的问题。使用闭包 (function(n){PageMethods.ProcessName(n, onSuccess);})(name); onSuccess 必须在循环外定义。

标签: javascript jquery asp.net


【解决方案1】:

您可以尝试在调用ProcessName() 之前移动onSuccess 函数。你甚至可以像这样将它移动到一个局部变量中:

var onSuccess = function(result) {
    if (result == "") {
        //code to populate a label
    }                       
}
PageMethods.ProcessName(name, onSuccess);

或者您可以像这样将匿名函数直接传递给PageMethods.ProcessName()

PageMethods.ProcessName(name, function(result) {
    if (result == "") {
        //code to populate a label
    }                       
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多