在嵌套函数中返回

时间:2014-11-21 22:41:05

标签: javascript jquery asp.net jquery-ui

我使用了apprise函数,yes表示返回true,No表示返回false 我使用它来使用onclientclick方法验证控件。 函数嵌套时,返回参数似乎没有返回 任何人都知道如何正确地返回测试(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();

            }
        });
}

2 个答案:

答案 0 :(得分:0)

其实我觉得,你不应该回来。您添加了一个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
}

答案 1 :(得分:0)

正如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;
};

如果您看一下流程,它会自上而下:

  • 步骤1
  • 步骤2
  • callback goOnHere
  • goOnHere返回
  • 因为callFunction是一个纯粹的调用,所以每个返回值都被抛弃
  • Step3
  • return从函数
  • 返回

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

可能的出路是 MVC -Style编程:

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

对于事件驱动的 - 编程,您需要一种不同的心态。首先,我很难理解这些概念。