2016-05-13 6 views
1

Я пытаюсь получить данные json из одного API с использованием метода Meteor, я попытался использовать meteor wrapAsync, а также Node Future. Ниже мой код:Meteor wrapAsync/Node Fiber Future Не работает

Шаблон 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; 

    } 
    }); 

    } 

Метод 1: Использование Метеора wrapAsync - серверной

'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; 


} 

Метод 2: Использование узел Fiber перспективного Сторона сервера

'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(); 


} 

В обоих методах я получаю значения, напечатанные в консоли, но они не возвращаются.

Ниже приведен скриншот: Console Log

Я не знаю, где я не прав, Может кто-нибудь пожалуйста, предложите мне что-нибудь.

Отредактирован: Добавлен шаблон Код:

<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

Где и как вы звоните '' getLocationTimebyAPI?Пожалуйста, дайте пример –

+0

Выше код шаблона, вызывающий функцию помощника шаблона – Manu

ответ

1

С чего docs говорят, что вы можете просто опустить асинхронный обратный вызов, и он будет работать синхронно. Так это должно работать на сервере:

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

На клиенте, помощник шаблон должен вернуть undefined поскольку, когда помощник называется не возвращает никакого значения, пока. И в хелпере нет реактивного источника данных, из-за чего шаблон будет повторно удален. Итак, используйте reactive-var, чтобы сохранить результат или использовать этот пакет от stubailo meteor-reactive-method.

Сообщите мне, если это решит вашу проблему!

+0

Это решило мою проблему Большое спасибо @tomsp – Manu

+0

Рад, что я мог помочь! – tomsp

0

Я использовал метод, упомянутый выше @tomsp:

Первых добавляемый https://atmospherejs.com/simple/reactive-method

метеора добавить простым: реактивно-метод

Затем изменил код

стороны сервера Метод

'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 Helper Функция

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

} 

Результаты показаны на рисунке ниже:

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^