我理解 return
和 resolve
之间的区别,但我觉得我在需要的地方用 return
乱扔了我的代码 promise 根据逻辑立即解决或拒绝。
这是我的实际代码:
function bridge_component_start_in_batch_test() {
let fake_batching_counter = 0;
function bridge_component_start_recursive_callback() {
console.log('Running a batch...');
return new Promise((resolve, reject) => {
if (fake_batching_counter == 3) {
resolve({
'done_batching': true
});
}
resolve({
'done_batching': false
});
});
}
const bridging_result = new Promise((resolve, reject) => {
const recursively_bridge_component_start = () => bridge_component_start_recursive_callback().then(response => {
if (response.done_batching == true) {
console.log('Done batching!');
resolve(response);
return (response);
}
fake_batching_counter++;
recursively_bridge_component_start();
}).catch(error => {
reject(error);
return (response);
});
recursively_bridge_component_start();
});
return bridging_result;
}
bridge_component_start_in_batch_test().then(result => {
console.log(result);
});
如果我删除 return 语句,我就会进入无限循环,这是理所当然的。
我知道return
用于停止recursively_bridge_component_start
的运行,它与promise本身无关,但这感觉非常矛盾。
有没有办法以某种方式重写这个,这样我就不必用 return 语句乱扔所有东西?
最佳答案
只是不要使用 if (...) { ...;返回; } …
,但是 if (…) { … } else { … }
:
const recursively_bridge_component_start = () => bridge_component_start_recursive_callback().then(response => {
if (response.done_batching) {
console.log('Done batching!');
resolve(response);
} else {
fake_batching_counter++;
recursively_bridge_component_start();
}
}, reject);
<小时/>
也就是说,您还应该避免 Promise
constructor antipattern ,这将完全回避你的问题:
let fake_batching_counter = 0;
function run_batch() {
fake_batching_counter++;
console.log('Running a batch...');
return new Promise((resolve, reject) => {
setTimeout(() => { // at least simulate asynchrony
resolve({
'done_batching': fake_batching_counter == 3
});
}, 1000);
});
}
function run_recursively() {
return bridge_component_start_recursive_callback().then(response => {
if (response.done_batching == true) {
console.log('Done batching!');
return response;
} else {
return run_recursively();
}
})
}
const bridging_result = run_recursively();
关于javascript - 我可以通过 Promise 的解析/拒绝来控制函数的流程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57508518/