仅为副作用导入ES6模块的公认做法是什么?

5

我喜欢保持我的代码模块化,因此我将这种代码放在单独的文件中 (overrides/extra.js):

import Ember from 'ember';

Ember.RSVP.configure('onerror', function(error) {
    ....
});

export default null;

这只有配置 Ember.RSVP 的副作用,但没有导出任何有价值的内容。然后,我会在 app.js 中导入它:

import dummy from './overrides/extra';

这是一种被接受的做法吗?


1
不,最好只说“import './foo';”。 - user663031
2
我会导出一个执行配置的函数。奖励:你可以让它返回一个 Promise 以便在调用代码中继续进行,因为你很可能需要确保它已完成。 - Denys Séguret
@DenysSéguret:你能展示一下你所说的例子吗? - blueFast
@gonvaled RGraham 指出 configure 函数设置了事件处理程序,但似乎没有设计用于报告初始化失败。如果是这种情况,我关于 promise 的观点在这里就比较薄弱了。不过,如果有用的话,我会在回答中详细说明。 - Denys Séguret
@DenysSéguret:我看了代码,我明白你的意思。现在它很好,谢谢! - blueFast
2个回答

6

如果你的模块不需要导出任何数据,那么这是被接受的,但是如果模块不需要导出任何内容,也就没有必要导出:

import Ember from 'ember';

Ember.RSVP.configure('onerror', function(error) {
    ....
});

app.js:

import './overrides/extra';

2

我通常会导出一个初始化函数:

  • 调用代码更加明确
  • 调用代码能够在成功或失败时采取行动

我不了解Ember及其初始化过程,但下面是可能的实现方式:

import Ember from 'ember';

export default function initialize(){
    return new Promise(function(ok, nok){
        try { // or any other kind of failure detection
            Ember.RSVP.configure('onerror', function(error) {
                ok();
            });
            ... you may do other initializations here
            ok();
        } catch (e) {
            nok(e);
        }
    });
}

在调用代码中
import initEmber from './yourFile.js';

initEmber()
.then(function(){
    ... here you know Ember is ready
})
.catch(function(){
    ... damn it!
});

请注意,如果Ember初始化是同步的并且不会失败,@RGraham的答案可能更适合您。

2
我对Ember一无所知,但onerror看起来更像是一个流式事件而不是一次性的事情。 - CodingIntrigue
@RGraham根据您的相关观察更新了答案。 - Denys Séguret
好的,谢谢你的建议。在这种情况下,我正在重新配置Ember中的promise系统,以便每当一个promise被拒绝时,在控制台上显示错误信息,所以这不是在初始化时发生的错误。所以RGraham的答案对我更合适。 - blueFast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接