J'ai deux fonctions dans jquery. J'appelle la première fonction et à l'intérieur, avec un délai de 2 secondes, j'appelle la deuxième fonction.

Je veux obtenir la valeur renvoyée de la deuxième fonction, mais cela ne fonctionne pas.

Si je remplace return par console.log(param2), cela fonctionne très bien.

function func2(param2) {
    return param2;
};


function func1(param1) {
    param1++;
    window.setTimeout(func2,2000,param1);
}
func1(1);
2
user1361208 10 juil. 2015 à 15:03

2 réponses

Meilleure réponse

Mise à jour # 1:

Il existe une meilleure façon de le faire avec Javascript Promise (une méthode de rappel asynchrone facile)

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); 
});

Mise à jour n ° 2: (Solution)

Après votre commentaire sur ce que vous essayez de faire, voici ma solution à votre problème. J'ai testé ceci et son fonctionnement. J'espère que cela résoudra votre problème.

Utilisez MessageEvent pour déclencher la fonction C # lorsque vous avez terminé votre traitement sur func2 (). Reportez-vous à mon exemple ci-dessous,

    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

De cette façon, vous déclenchez func1 () en appelant

geckoWebBrowser1.Navigate("javascript:func1(1)");

Et func1 () déclenche func2 () en utilisant setTimeout après 2 secondes,

window.setTimeout(func2,2000,param1);

Et func2 () déclenche la fonction c # avec le résultat en utilisant MessageEvent

var result = 'Result from Func2 -->'+param2;
var e = new MessageEvent('Func2Result'{
      'view':window,'bubbles':false,'cancelable':false,'data':result
});
document.dispatchEvent(e);

Notez l'EventListener qui mappe le message d'événement javascript "Func2Result" avec la fonction C # ProcessFunc2Result ()

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

J'ai utilisé la version 31.0.0.1 de GeckoFx et la version 31.0 de Xulrunner

J'ai fait cela en C #, il n'y a pas beaucoup de différence pour faire la même chose en VB .NET.

1
Naren Neelamegam 12 juil. 2015 à 22:46

je veux obtenir la valeur retournée de la deuxième fonction.

Vous ne pouvez obtenir que la valeur de retour d’une fonction que vous appelez. Mais vous n'appelez pas func2. Le navigateur le fait à un moment donné dans le futur. Il n'y a aucun moyen pour vous d'obtenir la valeur de retour, sauf si setTimeout en fournit un moyen. Mais ce n'est pas le cas.

Vous pouvez modifier votre code comme indiqué ci-dessous:

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

Maintenant, vous appelez func2 et vous pouvez faire quelque chose avec la valeur de retour. Cependant, vous ne pourrez pas obtenir la valeur de retour à l'intérieur de func1, car, encore une fois, func1 n'appelle pas (directement) func2.

2
Felix Kling 10 juil. 2015 à 12:49