我理解return和resolve之间的区别,但我觉得我在用return乱丢代码,因为我需要基于逻辑立即解决或拒绝的承诺。
下面是我的实际代码:
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语句把所有的东西都弄乱了?
发布于 2019-08-15 19:30:10
只是不要使用if (…) { …; return; } …,而是使用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();发布于 2019-08-15 20:14:15
Promise.all()是返回项目的函数的最佳选择。
https://stackoverflow.com/questions/57508518
复制相似问题