我正在摆脱我的阻塞无限循环并用promises代替它。我有一个简单的运行功能,它点亮一个LED并将其关闭,然后继续下一个LED。
显然,Promise在循环中不起作用,所以我想知道如何使用递归返回我的run()
函数并增加我的计数器x
?
var x = 0
var sign = 1
function run() {
return new Promise((resolve, reject) => {
try {
wait(20).then(() => { device.setColor("random", { 'channel': 0, 'index': x }) })
wait(20).then(() => { device.setColor("#000000", { 'channel': 0, 'index': x }) })
x += sign
if (x == LED_COUNT - 1) {
sign = -1
} else if (x == 0) {
sign = 1
}
return resolve()
} catch (e) {
return reject(e)
}
})
}
run() // this only runs once, I need it to run forever
答案 0 :(得分:2)
递归电话:
将.then(run())
添加到您的承诺的最后。
不确定你的等待是如何工作的,我使用setTimeout将每个循环延迟1秒。以下示例:
var x = 0
var sign = 1
function run() {
return new Promise((resolve, reject) => {
try {
//example only
console.log('x-->' + x);
//wait(20).then(() => { device.setColor("random", { 'channel': 0, 'index': x }) })
//wait(20).then(() => { device.setColor("#000000", { 'channel': 0, 'index': x }) })
x += sign
if (x == LED_COUNT - 1) {
sign = -1
} else if (x == 0) {
sign = 1
}
return resolve()
} catch (e) {
return reject(e)
}
}).then(setTimeout(function(){ run() }, 1000));
}
run();

答案 1 :(得分:0)
我假设您想要等待两个承诺,然后再次运行它?这是你可以尝试的一种方式。如果您有权使用Promise.try
而不是Promise.resolve().then(...
var x = 0
var sign = 1
function run() {
return Promise.resolve().then(function() {
x += sign
if (x == LED_COUNT - 1) {
sign = -1
} else if (x == 0) {
sign = 1
}
return Promise.all([
wait(20).then(() => {
device.setColor("random", {
'channel': 0,
'index': x
})
}),
wait(20).then(() => {
device.setColor("#000000", {
'channel': 0,
'index': x
})
})
]);
}).then(run);
}
run()

您也可以在一个函数中将它们分组,并且仅使用一个wait(20)
承诺:
return wait(20).then(() => {
device.setColor("random", {
'channel': 0,
'index': x
});
device.setColor("#000000", {
'channel': 0,
'index': x
});
})
答案 2 :(得分:0)
不确定为什么你需要这里的承诺。这段代码将是异步的。
var x = 0
var sign = 1
function run() {
setTimeout(function () {
device.setColor("random", {'channel': 0, 'index': x})
device.setColor("#000000", {'channel': 0, 'index': x})
if (x == LED_COUNT - 1) {
sign = -1
} else if (x == 0) {
sign = 1
}
run()
}, 20000)
}
run()