![](/img/trans.png)
[英]Why can I await a promise resolve execution, but not a promise reject one?
[英]Can I control the flow of a function with a Promise's resolve / reject?
我理解了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 (…) { …; return; } …
if (…) { …; return; } …
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
構造函數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();
Promise.all()是對返回項目的函數的最佳選擇。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.