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-fibers
Если вы хотите, чтобы продвинутое решение через node.js «показывалось», вы можете перейти на node-fibers
a> и создать функцию 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. Джо описал одну из возможных реализаций. Но я приведу небольшой фрагмент кода, чтобы было легче понять, как это работает на самом деле, используя Defferred
из jQuery:
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");
});
Если промисы не поддерживаются, вам потребуется полифиллы для ECMAScript, например Promises из пакета core-js
или любого другого автономного компонента реализации Promises/A+.
Отложенный, может быть получен как отдельный пакет Deffered
для Кроме того, концепция NPM хорошо описана здесь.
person
Farside
schedule
30.03.2016