在NodeJS中使用Promise递归创建无限循环

时间:2017-10-25 18:55:20

标签: javascript node.js recursion

我正在摆脱我的阻塞无限循环并用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

3 个答案:

答案 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()