1. 一行解决方案:
先前被接受的解决方案只会让事情变得复杂,没有提高可读性或改进。那么可以像这样做,使用一行代码:
setTimeout(function(){ SendSerialPortCommand("XXX"); }, 500);
setTimeout(function(){ SendSerialPortCommand("YYY"); }, 1500);
setTimeout(function(){ SendSerialPortCommand("ZZZ"); }, 2000);
2. 简单可配置的解决方案:
如果你想要使其可配置,将选项移至上方的配置中,并在循环中调用,例如:
var schedulerData = [
{delay: 500, params: "XXX"},
{delay: 1500, params: "YYY"},
{delay: 2000, params: "ZZZ"}
];
for (var i in schedulerData) {
var doTimeout = function(param, delay) {
setTimeout(function(){ SendSerialPortCommand(param); }, delay );
};
doTimeout(schedulerData[i].params, schedulerData[i].delay);
}
这里是JSFiddle,可以进行操作。
3. 使用node模块node-fibers
如果你想通过node.js获得高级解决方案以“炫耀”,你可以选择使用node-fibers
,并创建类似于他们手册中的sleep函数。
var Fiber = require('fibers');
function sleep(ms) {
var fiber = Fiber.current;
setTimeout(function() {
fiber.run();
}, ms);
Fiber.yield();
}
Fiber(function() {
SendSerialPortCommand("XXX");
sleep(1000);
SendSerialPortCommand("YYY");
}).run();
console.log('still executing the main thread');
node-fibers
实现被用于许多其他更小的库,例如WaitFor。可以在这里找到更多信息。
4. 使用Promise
和Deferred
对象
您可以创建基于Promise的超时函数。
Joe描述了一种可能的实现方式。但是,为了更容易理解它的工作原理,我提供了一个小代码片段,使用jQuery的Deferred
:
function wait(ms) {
var deferred = $.Deferred();
setTimeout(deferred.resolve, ms);
return deferred.promise();
}
wait(500).then(function () {
SendSerialPortCommand("XXX");
}).wait(500).then(function () {
SendSerialPortCommand("YYY");
});
如果不支持Promise,你需要获取ECMAScript的polyfills,例如
核心库core-js
中的Promise或任何其他独立的Promises/A+实现组件。
Deffered也可以作为单独的
NPM包Deffered
获得,这个
概念在这里被很好地描述了。