我目前正在构建一个学习者React/Redux应用程序,我无法解决如何为服务进行依赖注入.
更具体一点:我有一个BluetoothService(抽象第三方库)扫描并通过蓝牙连接到其他设备.该服务被动作创建者利用,如下所示:
deviceActionCreators.js:
const bluetoothService = require('./blueToothService')
function addDevice(device) {
return { type: 'ADD_DEVICE', device }
}
function startDeviceScan() {
return function (dispatch) {
// The Service invokes the given callback for each found device
bluetoothService.startDeviceSearch((device) => {
dispatch(addDevice(device));
});
}
}
module.exports = { addDevice, startDeviceScan };
Run Code Online (Sandbox Code Playgroud)
(我正在使用thunk-middleware)
我的问题是:如何将服务本身注入动作创建者?
我不希望硬编码require(或import在ES6中),因为我认为这不是一个好的模式 - 除了使测试更加困难之外.我还希望能够在我的工作站(没有蓝牙)上测试应用程序时使用模拟服务 - 所以根据环境我希望在我的action-creator中注入相同界面的其他服务.使用静态导入是不可能的.
我已经尝试将bluetoothService作为Method本身的一个参数(startDeviceScan(bluetoothService){}) - 有效地使方法本身是纯粹的 - 但这只是使用动作将问题移动到容器.每个容器都必须知道该服务然后获得它的实现(例如通过props).另外,当我想在另一个动作中使用动作时,我又会遇到同样的问题.
目标:我想决定在我的应用程序中使用哪些实现的自举时间.这样做是否有好方法或最佳实践?
我正在尝试将调用链接到AngularJS的$timeout函数.我在这里看到很多线程允许链接承诺,一些特别使用角度$q,但这似乎应该是超级简单.我想我错过了一些明显的东西.这就是我想要的是什么喜欢做的事:
$timeout(firstFunction, firstDelay)
.then($timeout(secondFunction, secondDelay))
.then($timeout(thirdFunction, thirdDelay));
Run Code Online (Sandbox Code Playgroud)
当所有三个函数都被调用时,$timeouts都会同时启动.我可以看出为什么这不起作用,但我怎样才能得到我想要的东西?我甚至可以在这里使用承诺吗?我以前只是安排延迟,以便他们级联,但这似乎更多的工作维持...