2016-11-20 5 views
0

Ich mag Helfer für die Rückkehr String-Daten erzeugen würde:Meteor Helfer Rückkehr nichts

className() { 

    let className; 

    Meteor.call('getIp', (err, res) => { 

     if (err) { 
     console.log(err); 
     } else { 

     // User ip 
     let ip = res.data.ip; 
     let userLikers = this.likers; 

     // Si l'utilisateur a déjà aimé le post 
     if (userLikers.includes(ip)) { 
      className = 'icon-favorite'; 
     } else { 
      className = 'icon-favorite-border'; 
     } 

     console.log(className); 

     return className; 

     } 
    }); 

    } 

Meine console.log (classname) ist gut, und ich verstehe nicht, warum meine Rückkehr ist leer.

Wer hat eine Idee?

Vielen Dank!

Antwort

0

Meteor.call() läuft asynchron auf der Clientseite. Wie bei allen asynchronen Funktionen verwenden sie eine Callback-Funktion. In Ihrem Fall ist das der (err, res) => { ... } Teil des Codes.

Das bedeutet, dass return className; der Rückgabewert der Callback-Funktion ist. Der Code vor oder nach dem Aufruf Meteor.call() verwendet jedoch einen anderen Bereich. Die Funktion classname() gibt also im Grunde nichts zurück, da es für diese Funktion keine Rückgabeanweisung gibt.

Wahrscheinlich möchten Sie die Daten innerhalb des Callbacks einer anderen Variablen zuweisen, die vor dem Callback-Aufruf deklariert wurde. Z.B. so etwas wie

//Just for illustration. 
//Do NOT use it, as it will not work an will not do what you might think it does. 
className() { 

    let value; 

    Meteor.call('getIp', (err, res) => { 
     //do other stuff like error handling 
     // and getting the value here ... 

     console.log(className); 
     value = className; 
    }); 

    return value; 
} 

Aber das ist immer noch nicht für die Asynchronität. Es ist sehr gut möglich, dass die Funktion zurückkehrt, bevor der Callback ausgelöst wurde. In diesem Fall erhalten Sie immer noch einen leeren Rückgabewert. Um dies zu vermeiden, versuchen Sie Meteor.wrapAsync() zu verwenden, um die Meteor.call() darin zu verpacken. Auf diese Weise können Sie den Rückgabewert des asynchronen Funktionsaufrufs abrufen.

+0

Async-Wrapping funktioniert nicht auf dem Client (wo dieser Code wahrscheinlich ausgeführt wird). Mir ist keine elegante Art bekannt, asynchronen Code in Blaze-Helfern zu verwenden, außer reaktive Datenquellen zu haben. Ein Anruf gehört nicht zu diesen Quellen. – MasterAM

+0

Ja, Async Wrap funktioniert nicht auf dem Client. Aber wie kann ich meine Daten überprüfen? –

+0

Sie erklären das grundlegende Problem, das ist gut, aber ich denke nicht, dass es eine gute Idee ist, Code zu schreiben, der nicht zuverlässig funktioniert - es ist daher keine Lösung für das Problem. – Mikkel

0

Hier ist zu beachten, dass der Server und der Client an verschiedenen Orten ausgeführt werden, einer auf dem Server und einer im Browser. Meteor macht diesen Unterschied weniger offensichtlich und macht es weitgehend nahtlos, Daten umzuleiten.

Eine Technik, die ich verwende, ist, die Server-Methode zu bekommen, um das Ergebnis in eine Mongo-Sammlung einzufügen. Die Helfer auf dem Client werden automatisch ausgeführt, und der Client kann sie beim Eintreffen anzeigen.

0

Wie die anderen Antworten gezeigt haben, wird die Verwendung von Meteor Methoden (oder anderen asynchronen Codes) in einer Hilfsfunktion (d. H. Während des Renderings) nicht funktionieren. Helfer können nicht blockieren, also kann nicht auf die Ergebnisse vom Server warten.

Wenn Sie jedoch versuchen, was Sie zu tun versuchen, gibt es wahrscheinlich bessere Lösungen. Ihr Client-Code fragt den Server nach der IP-Adresse des Clients, damit Sie geeignete CSS-Klassen auswählen können.

Ich würde vorschlagen, dass Sie sich in Meteor's ausgezeichnetes Konto-Paket ansehen - es ist sehr einfach zu arbeiten und bietet Ihnen eine robuste Möglichkeit, Benutzer zu identifizieren.

Wenn Sie diese Personalisierung bereitstellen möchten, ohne dass Benutzer sich anmelden müssen, würde ich vorschlagen, dass Sie entweder eine persistente ID auf dem Client speichern (dh mit random Modul generieren, in localStorage speichern, oder über persistent-session) oder ähnlich) oder speichern Sie einfach auf dem Client die Liste der Elemente (Posts?), die dieser Benutzer mochte.

Dies vermeidet auch die Tatsache, dass, wenn Ihre Benutzer statische IP-Adresse haben, diese häufig ändern.

0

Sie können versuchen, indem Sie Sitzung verwenden. Wenn die Vorlage geladen wird, rufen Sie Ihre Methode auf und weisen Sie der Rückrufaktion im Rückruf einen Rückgabewert zu.In helper können Sie diese Sitzung verwenden, um gültige Daten zurückzugeben, da die Sitzung zu Beginn nicht definiert ist. Wenn sie jedoch im Callback festgelegt wird, wird helper automatisch erneut ausgeführt und die Sitzung gibt den gültigen Wert zurück. Hoffe, das kann Ihnen bei Ihrem Problem helfen :)

Verwandte Themen