2016-11-13 6 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; 
     }); 
    }); 
}); 

ありがとうございました。

関連する問題