2016-07-03 2 views
1

Я пытаюсь сделать так, чтобы я мог передать переменную тенденций из ее функции в рендеринг для моего шаблона Pug, и я не могу это сделать.Использование переменной Node.js вне функции

var express = require('express');                                 
var router = express.Router();                                  
var googleTrends = require('google-trends-api');                              
var auth = require('http-auth');                                  
var ustrends;                                      
var uktrends;                                      
const Console = require('console').Console;                               
var basic = auth.basic({                                    
    realm: "Web."                                    
}, function (username, password, callback) { // Custom authentication method.                     
    callback(username === "user" && password === "pass");                          
    }                                        
);                                         

var find = ',';                                      
var regex = new RegExp(find, 'g');                                 


googleTrends.hotTrends('US').then(function(trends){                             
ustrends = trends                                    
});                                         

googleTrends.hotTrends('EU').then(function(trends1) {                            
uktrends = trends1                                    
});                                         

console.log(ustrends);                                    
/* GET home page. */                                     


router.get('/', auth.connect(basic), function(req, res, next) {                          
res.render('index', {trends: ustrends.toString().replace(regex, ", "), trends1: uktrends.toString().replace(regex, ", "), title: 'Trends in the U.S & U.K'}); 

});                                         

module.exports = router;                                         

Как вы можете видеть, что я пытаюсь передать «ustrends» и «uktrends» переменные в визуализатор. Любая помощь приветствуется.

+0

Что именно вызывает проблемы? Являются ли 'ustrends' и' uktrends' пустыми или нулевыми или иначе что-то, чего вы не ожидали, в рендеринге? – kevin628

+0

если проблема является областью переменных, попробовать в первую очередь: router.get ('/', auth.connect (основной), функция (REQ, разреш, следующая) { вар resultObj; resultObj.ustrends = ustrends; resultObj .uktrends = uktrends; res.json (resultObj); }); Вы видите пустой объект, когда вы запрашиваете/url? – SamiX

ответ

1

Помните, что hotTrendswill return a promise, так как он получает результаты API Google. Поскольку средство визуализации находится вне обратных вызовов, в которых ustrends и uktrends установлены в значения, нет гарантии, что эти значения будут установлены до вызова вызываемого визуализатора.

Вы можете использовать несколько вложенных обратных вызовов, но это может привести к тому, что некоторый код сильно сдвинут вправо; Я рекомендую библиотеку async, которая имеет функцию под названием series, которая позволяет передать в 1) массив функций, которые будут выполняться по порядку, и 2) обратный вызов, который будет выполнен после завершения функций, который принимает ошибку, если бы один и результат функций в качестве аргумента. В нижеприведенном фрагменте API-интерфейс тенденций возвращает результаты до вызова визуализатора:

async.series([ 
    function(cb) { 
     googleTrends.hotTrends('US').then(function(trends){                             
      ustrends = trends; 
      cb(); 
     }) 
    }, 
    function(cb) { 
     googleTrends.hotTrends('EU').then(function(trends1) {                            
      uktrends = trends1; 
      cb();                                    
     }); 
    } 
], function(err, results) { 
    /* handle errors, do rendering stuff */ 
}) 
Смежные вопросы