延迟加载时,Moment Js加载本地化为时已晚

时间:2018-10-19 20:45:19

标签: javascript momentjs

因此,我尝试了两种方法来设置Moment.js的语言环境。两种方法都不起作用,或者我应该说为时已晚。我的“愿望”是异步导入语言环境文件(灵感来自here)。

当我进入页面时,日期仍然是英语格式,即使它应该是德语。

我正在使用以下方式异步加载数据:

window.moment = require('moment');
moment().format();

window.moment = require('moment-shortformat');
moment().short()

window.moment = require('moment-timezone');

const lang = document.documentElement.lang.substr(0, 2); //for the language

if(lang != 'en'){
    import(`moment/locale/${lang}.js`);
    moment.locale(lang)
}

由于import(moment/locale/${lang}.js);解决了承诺,因此我在加载文件时在控制台中签入。 moment.locale(lang)行之后大约1秒钟(难怪现在还没有准备好显示正确的翻译日期)。

一个小的检查结果表明:当我在控制台中写入moment.locale()时,正确设置了语言环境。

如果我不使用延迟加载,就像这样:

import 'moment/locale/de';
moment.locale(lang);

一切正常。

我的第二种方法是更长的时间,但是仍然没有运气。把它们加起来。我使用

在php后端创建了一个javascript文件:
...
$file = base_path('node_modules/moment/locale/' . $locale . '.js');
...

所以我可以动态调用正确的js文件。但是仍然没有运气。

知道我在做什么错吗?

2 个答案:

答案 0 :(得分:1)

是的,如果它是异步的并且正在等待诺言,则必须链接一个then()呼叫。这是https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import

中的示例
import('/modules/my-module.js')
  .then((module) => {
    // Do something with the module.
  });

答案 1 :(得分:1)

由于动态导入返回了承诺,因此您可以在解决承诺后调用moment.locale:

if(lang != 'en'){
  import(`moment/locale/${lang}.js`).then(module => {
    moment.locale(lang)
  });
}