1。单线解决方案:
Previously accepted solution 只是使事情复杂化,并没有带来任何可读性或改进。那么就这样做吧,单行:
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-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。更多信息可以在here找到。
4。使用Promise & Deferred 对象
您可以创建一个基于 Promise 的超时函数。 Joe 描述了一种可能的实现方式。但我会提供小代码 sn-p,以便更容易理解它的实际工作原理,使用来自 jQuery 的Defferred:
function wait(ms) {
var deferred = $.Deferred();
setTimeout(deferred.resolve, ms);
// We just need to return the promise not the whole deferred.
return deferred.promise();
}
// Use it
wait(500).then(function () {
SendSerialPortCommand("XXX");
}).wait(500).then(function () {
SendSerialPortCommand("YYY");
});
如果不支持 Promise,您需要为 ECMAScript 获取 polyfills,例如 Promises from core-js package 或 Promises/A+ 实现的任何其他独立组件.
延迟,也可以作为单独的Deffered package for NPM 获得,concept is nicely described here。