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。
如果您实际上希望如上所述无限循环,那么如何在不编写回调地狱的情况下更改此代码?
答案 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)