我在jquery中有两个函数。我调用第一个函数并在其中,延迟2秒,我调用第二个函数。
我想获得第二个函数的返回值,但它不起作用。
如果我用console.log(param2)
替换return,它就可以正常工作。
function func2(param2) {
return param2;
};
function func1(param1) {
param1++;
window.setTimeout(func2,2000,param1);
}
func1(1);
答案 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)");
}
}
这样,你可以通过调用
来触发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中做同样的事情差别不大。