2016-11-13 19 views
0

嘗試等待total.js中的異步調用進行本地化。但是,當我嘗試使localization.js部分等待響應時,程序會繼續並自動選擇語言「en」。下面的代碼沒有關注異步過程,但我分享它來展示我正在嘗試做什麼。任何想法如何做到這一點?Total.js等待本地化中的事件

var COOKIE = '__language', 
allowed = {en: true, dk: true}; 

F.onLocate = function (req, res) { 
var self = this, 
language = req.query.language || req.cookie(COOKIE); 
var userIP = self.ip 

// Set the language according to the querystring and store to the cookie 
if (language) { 
    if (!allowed[language]) 
     return 'en'; 
    res.cookie(COOKIE, language, '2 days'); 
    return language; 
} 

// addition if cookie is not set, first time Danish users will have 'dk' cookie set 
else { 
// return from here works 
    Util.waitUtils.request('https://ipfind.co?ip='+userIP +'&auth=myauthcodehere' 
    , ['get'], function(err, data, status, headers) { 


      var result = JSON.parse(data); 

      if(result.country_code === 'DK') 
      { 
       res.redirect('/?language=dk'); 

      } 
}); 
} 

res.cookie(COOKIE, 'en', '2 days'); 
return 'en'; 
}; 

回答

1

這是不可能的。 F.onLocale是同步的。 解決方案是使用中間件:

F.middleware('language', function(req, res, next) { 

    // ... 
    // ... 

    RESTBuilder.make(function(builder) { 
     builder.url('https://ipfind.com?ip={0}&myauthcodehere={1}'.format(req.ip, 'myauthcodehere')); 
     builder.exec(function(err, response) { 

      req.language = response.country_code; 
      next(); 

      // or 
      // res.redirect('?language=dk'); 
      // next = null; 
     }); 
    }); 
}); 

謝謝。