2016-05-13 20 views
1

Ich versuche, Json-Daten von einer API mit Meteor-Methode zu bekommen, ich habe versucht, Meteor WrapAsync sowie Node Future zu verwenden. Unten ist mein Code:Meteor wrapsAsync/Node Fiber Future Funktioniert nicht

Template Helper - Client Side

getLocationTimebyAPI: function (company_location) { 

    Meteor.call('getLocationTimebyAPIServerMethod', company_location, function(error, results){ 
    if(error){ 
     console.log('error',error.reason); 
    } else { 

     var localtime = results.data.data.time_zone[0].localtime 
     var utcoffset = results.data.data.time_zone[0].utcOffset 
     console.log(localtime+ ' '+utcoffset); 

     var returntext = localtime+' (UTC '+utcoffset+')'; 
     return returntext; 

    } 
    }); 

    } 

Methode 1: Verwenden Meteor wrapAsync - Server Side

'getLocationTimebyAPIServerMethod': function(company_location){ 

    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXX'; 

    var convertAsyncToSync = Meteor.wrapAsync(HTTP.get), 
    resultOfAsyncToSync = convertAsyncToSync(apiurl); 

    return resultOfAsyncToSync; 


} 

Methode 2: Verwenden Knoten Fiber Future- Serverseite

'getLocationTimebyAPIServerMethod': function(company_location){ 

    // use the node fibers npm 
    var Future = Npm.require('fibers/future'); 

    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXXXX'; 

    // Create our future instance. 
    var future = new Future(); 

    HTTP.get(apiurl, {}, function(error, response) { 
     if (error) { 
    future.return(error); 
     } else { 
    future.return(response); 
     } 
    }); 

    return future.wait(); 


} 

In beiden Methoden bekomme ich die Werte in der Konsole gedruckt, aber sie werden nicht zurückgegeben.

Unten finden Sie den Screenshot: Console Log

Ich weiß nicht, wo ich falsch bin, Könnte jemand mir bitte etwas vorschlagen.

Edited: Added Template Code:

<tr> 
     <td>Local Time:</td> 

     <td><input id="company_location_time" name="company_location_time" type="text" size="23" placeholder="Lead Company Location Time" value="{{getLocationTimebyAPI company_location}}" readonly style="background:#7FAAFF;font-weight:bold;"><p style="font-size:8px;">Local Time Powered By <a style="font-size:8px;" href="http://www.worldweatheronline.com/search-weather.aspx?q={{company_location}}" target="_blank">World Weather Online</a></p></td> 
    </tr> 
+0

Wo und wie rufst du '' getLocationTimebyAPI?Bitte geben Sie ein Beispiel an –

+0

Oben ist der Vorlagencode, der die Template-Hilfsfunktion aufruft – Manu

Antwort

1

Von dem, was die docs sagen, können Sie einfach von der Asynchron-Rückruf weglassen und es wird synchron laufen. So sollen diese auf dem Server arbeiten:

'getLocationTimebyAPIServerMethod': function(company_location){ 
    // do checks 
    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=XXXXXX'; 
    var result = HTTP.get(apiurl); 
    return result; 
} 

Auf dem Client sollte die Vorlage Helfer undefined zurückkehren, da, wenn die Helfer aufgerufen wird kein Rückgabewert ist, noch nicht. Und es gibt keine reaktive Datenquelle im Helper, die dazu führen würde, dass die Vorlage neu gerendert wird. Verwenden Sie also entweder reactive-var, um Ihr Ergebnis zu speichern, oder verwenden Sie dieses Paket von stubailo meteor-reactive-method.

Lassen Sie mich wissen, ob das Ihr Problem löst!

+0

Es löste meine Ausgabe Vielen Dank @tomp – Manu

+0

Ich bin froh, dass ich helfen konnte! – tomsp

0

Ich habe das Verfahren durch @tomsp oben erwähnt verwendet:

Erste hinzugefügt https://atmospherejs.com/simple/reactive-method

Meteor hinzufügen einfach: reaktive Verfahren

Dann ist mein Code geändert

Server Side Methode

'getLocationTimebyAPIServerMethod': function(company_location){ 
    // do checks 
    var apiurl = 'http://api.worldweatheronline.com/free/v2/tz.ashx?q='+company_location+'&format=json&key=50a151065dc2a4ea69c1b93032805'; 
    var result = HTTP.get(apiurl); 

     var localtime = result.data.data.time_zone[0].localtime 
     var utcoffset = result.data.data.time_zone[0].utcOffset 
     var returntext = localtime+' (UTC '+utcoffset+')'; 
     return returntext; 
} 

Client Side-Hilfsfunktion

getLocationTimebyAPI: function (company_location) { 
    return ReactiveMethod.call("getLocationTimebyAPIServerMethod", company_location); 

} 

Die Ergebnisse sind in der Abbildung unten gezeigt:

enter image description here