【问题标题】:return within a nested function [duplicate]在嵌套函数中返回 [重复]
【发布时间】:2014-11-21 22:41:04
【问题描述】:

我正在使用apprise函数,是返回true,否返回false 我正在使用它来验证带有 onclientclick 方法的控件。 由于函数是嵌套的,返回参数似乎没有返回。
任何人都知道我如何正确返回 test(e) 方法

function test(e) {

    apprise('Are you sure you want to add a 12 Month Donation?', { 'verify': true }, 
        function (r) {
        if (r) {
            // user clicked 'Yes'
            apprise("Donation Added");
        }
        else {
            // user clicked 'No'
            return false;

        }
    });       
}

我已将 java 脚本编辑为 Thomas 推荐的内容,但通过验证似乎仍然无法正常工作,尽管上面的 JS 函数返回了正确的参数

这里是编辑后的 ​​JS 和 asp 部分。 onclick 方法似乎永远不会在新代码中达到,但返回参数是正确的

OnClientClick ="if (!test()) {return false;}"
onclick="btn12MonthDonate"



function test() {
    function donationAdded() {
        console.log("yes");
        return true;
    };
    function donationNotAdded() {
        console.log("no");
        return false;
    };
    apprise('Are you sure you want to add a 12 Month Donation?', { 'verify': true },
        function (r) {
            if (r) {
                // user clicked 'Yes'
                apprise("Donation Added");
                donationAdded();
            }
            else {
                // user clicked 'No'
                donationNotAdded();

            }
        });
}

【问题讨论】:

  • apprise() 有什么回报吗?
  • @Quentin 可以,将此问题标记为重复。但是在链接线程中,并没有解释机制。从技术上讲,答案是正确的,但不是很详细。
  • @ThomasJunk — 您可以改进答案或为现有问题添加新答案。

标签: javascript jquery asp.net jquery-ui


【解决方案1】:

正如 plbsam 所写,apprise 函数有一个参数,即 callback(即作为参数传递并在某个时间点调用的函数)。

一个典型的控制流程是:

function(){
    Step1 ...
    Step2 ... 
    ...
    Step n
    return;
};

这是一个同步/线性控制流。

另一方面,callback 有助于异步控制流:

function(callback){
    Step1 ...
    Step2 ... 
    ...
    callback();
    ...
    Step n
    return;
};

这适用于事件驱动-编程:弹出一个对话框,确切时刻,当用户做出选择并且结果已知时,一个函数叫做。某个时间点,回调被调用。

因此,如果您希望您的控制流返回一个函数,请定义它应该在函数中返回的部分:

function(){
    var goOnHere=function(result){

    };
    Step1 ...
    Step2 ... 
    callFunction(goOnHere);
    Step n
    return;
};

function(callback){
    Step1 ...
    Step2 ... 
    ...
    callback(result);
};

因此您的代码可以转换为:

function test(e) {
    function donationAdded(){
        console.log("yes");
    };
    function donationNotAdded(){
        console.log("no");
    };
    apprise('Are you sure you want to add a 12 Month Donation?', { 'verify': true }, 
        function (r) {
        if (r) {
            // user clicked 'Yes'
            apprise("Donation Added");
            donationAdded();
        }
        else {
            // user clicked 'No'
            donationNotAdded();

        }
    });       
}

为了清楚起见,我解释了进一步的控制流程:

function(){
    var goOnHere=function(result){

       return value; // returns to the calling point
    };
    Step1 ...
    Step2 ... 
    callFunction(goOnHere); //pass flow to call function, which itself calls goOnHere
    Step 3
    return;
};

如果你看一下流程,它是从上到下的:

  • 第一步
  • 第二步
  • callbackgoOnHere
  • goOnHere返回
  • 由于callFunction 是一个纯调用,所以每个返回值都会被丢弃
  • 第三步
  • return 从函数返回

没有直接的方法可以返回一个值。这是单向的。

一种可能的出路是MVC-风格编程:

您将“模型”传递给内部函数,该函数本身已将callbacks 实现为“事件”。因此,如果您知道自己的“结果”,就可以将模型设置为适当的状态。之后,模型会触发一个change-事件,它的所有订阅者都可以对此做出反应。 细节超出了这个线程。

对于 事件驱动 编程,您需要不同的思维方式。起初很难理解这些概念。

【讨论】:

  • 感谢 Thomas,您的代码正是我想要的。不幸的是,我仍然可以让它工作。我已经为 no 部分添加了 return false 但我的 onclientclick 事件仍然没有验证 asp 部分见上文
  • 您的代码无法运行。问题是控制流:当你调用donationAdded 时,你是在传递给apprise 的匿名函数中进行的。如果您调用donation added,则流程将传递给先前定义的函数donationAdded,如果该函数的最后一行是return 语句,则流程将返回到匿名函数。
【解决方案2】:

其实我认为,你不应该回来。您添加了 return 语句的函数是回调函数。回调机制是返回机制的替代方案。您可以在回调函数中调用另一个函数来完成任务,而不是返回...

功能测试(e) {

apprise('Are you sure you want to add a 12 Month Donation?', { 'verify': true }, 
    function (r) {
    if (r) {
        // user clicked 'Yes'
        apprise("Donation Added");
    }
    else {
        // user clicked 'No'
        toBeCalledIfFalse(false);
    }

  }
)};

function toBeCalledIfFalse(){
    //code to handle false
}

【讨论】:

    猜你喜欢
    • 2014-09-01
    • 2015-07-20
    • 2015-08-01
    • 1970-01-01
    • 2011-03-23
    • 2020-05-11
    • 2015-03-15
    • 1970-01-01
    相关资源
    最近更新 更多