延迟函数的Jquery返回值不起作用

时间:2015-07-10 12:03:01

标签: javascript

我在jquery中有两个函数。我调用第一个函数并在其中,延迟2秒,我调用第二个函数。

我想获得第二个函数的返回值,但它不起作用。

如果我用console.log(param2)替换return,它就可以正常工作。

function func2(param2) {
    return param2;
};


function func1(param1) {
    param1++;
    window.setTimeout(func2,2000,param1);
}
func1(1);

2 个答案:

答案 0 :(得分:2)

  

我想得到第二个函数的返回值。

您只能获取正在呼叫的功能的返回值。但是你正在呼叫func2。浏览器在将来的某个时候会这样做。除非setTimeout提供方法,否则无法获得返回值。但它没有。

您可以更改代码,如下所示:

function func1(param1) {
    param1++;
    window.setTimeout(function(param1) {
        var result = func2(param1);
        console.log(result);
    }, 2000,param1);
}

现在您 调用func2,您可以使用返回值执行某些操作。但是,您无法在func1内获得返回值,因为func1不会(直接)调用func2

答案 1 :(得分:1)

更新#1:

使用Javascript Promise(一种简单的异步回调方法)更好的方法

function func2(param2, resolve, reject){
  resolve(param2);  
}

function func1(param1) {
   param1++;
   var promise = new Promise(function(resolve, reject) {
     window.setTimeout(func2,2000,param1,resolve,reject);
   });
   return promise;
}

func1(1).then(function(func2_value) {
  alert(func2_value); 
});

更新#2 :(解决方案)

在您对自己要做的事情发表评论之后,这是我解决您问题的方法。我已经测试了这个及其工作原理。希望这能解决你的问题。

使用MessageEvent在func2()上完成处理后触发C#函数。请参阅我的以下示例,

    public Form1()
    {
        InitializeComponent();
        Gecko.Xpcom.Initialize(@"C:\Naren\Setups\Gecko\xulrunner");
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        // Add a event listener to get a call back from javascript function -> func2()
        geckoWebBrowser1.AddMessageEventListener("Func2Result", ((string s) => this.ProcessFunc2Result(s)));

        // Load a sample HTML content to the browser
        geckoWebBrowser1.LoadHtml(@"
            <!DOCTYPE html>
            <html>
                <head>                 
                    <meta http-equiv=""Content-Type"" content=""text/html; charset=UTF-8"">
                    <script type=""text/javascript"">
                        function func2(param2){
                            var result = 'Result from Func2 -->'+param2;
                            var e = new MessageEvent('Func2Result',{'view':window,'bubbles':false,'cancelable':false,'data':result});
                            document.dispatchEvent(e);
                        }
                        function func1(param1){
                            param1++;
                            window.setTimeout(func2,2000,param1);
                        }
                    </script>
                </head>
                <body>
                    <H1><center>Jquery return value of delayed function doesn't work</center></H1>
                    <p><center>Solution is to add a MessageEvent to javascript and trigger C# function on func2 result</center></p>
                    <p><center>This page has a javascript function that can fire a C# function</center></p>
                </body>
            </html>
        ");


    }

    // Function receives Func2 result
    private void ProcessFunc2Result(string result)
    {
        MessageBox.Show(result);
    }

    // Button click event triggered from a button on your form
    // Trigger javascript function func1()
    private void button1_Click(object sender, EventArgs e)
    {
        geckoWebBrowser1.Navigate("javascript:func1(1)");
    }
}

Result screenshot of the above example code

这样,你可以通过调用

来触发func1()
geckoWebBrowser1.Navigate("javascript:func1(1)");

和func1()在2秒后使用setTimeout触发func2(),

window.setTimeout(func2,2000,param1);

和func2()使用MessageEvent

触发c#函数结果
var result = 'Result from Func2 -->'+param2;
var e = new MessageEvent('Func2Result'{
      'view':window,'bubbles':false,'cancelable':false,'data':result
});
document.dispatchEvent(e);

注意EventListener将javascript事件消息“Func2Result”映射到C#函数ProcessFunc2Result()

geckoWebBrowser1.AddMessageEventListener("Func2Result", ((string s) => this.ProcessFunc2Result(s)));

我使用过GeckoFx版本31.0.0.1和Xulrunner版本31.0

我在C#中做到了这一点,在VB .NET中做同样的事情差别不大。