承诺无限回调

时间:2019-07-03 18:12:40

标签: javascript promise

const foo = () => {
  console.log('ok')
  return Promise.resolve(1);
}

let bar = foo(); // line 1
bar.then(() => { // line 2
  bar = foo(); // line 3
})

奇怪为什么第3行不刷新第2行
造成无限
1.答应解决
2.将bar重新实例化为1。

如果您实际上希望如上所述无限循环,那么如何在不编写回调地狱的情况下更改此代码?

3 个答案:

答案 0 :(得分:1)

这是无休止的循环方式。为了不完全阻止浏览器,我添加了一个.strict(),所以承诺只能在大约半秒钟后解决:

setTimeout

没有const foo = () => { console.log('ok'); // Lets give the browser some air to breathe... return new Promise(resolve => setTimeout(() => resolve(1), 500) ); } const loop = async () => { while (true) await foo(); }; loop(); async语法:

await

答案 1 :(得分:0)

const foo = () => {
  console.log('ok')
  return Promise.resolve(1);
}

let bar = foo(); // line 1
bar.then((val) => { // line 2
   bar = foo() // line 3
})

首先,我们在此处执行foo()

let bar = foo(); // console.log('ok')

那你就做

bar.then((val) => { // after it
   bar = foo() // you again run this and get console.log('ok')
})

那又是什么?没有人再次运行它。

想要无限循环吗?

const foo = () => {
  console.log('ok')
  return Promise.resolve(1);
}

Promise.resolve().then(function resolver() {
    return foo()
    .then(() => console.log("ok"))
    .then(resolver);
})

答案 2 :(得分:0)

您可以使用一个递归函数,并在每次迭代中解析一个诺言

const foo = () => new Promise(resolve => {
  setTimeout(() => {
    console.log('ok');
    resolve()
  }, 1000)
})

const loop = (task) => {
  task().then(() => {
    loop(task)
  })
}

loop(foo)