簡體   English   中英

我可以用Promise的解決/拒絕控制功能的流程嗎?

[英]Can I control the flow of a function with a Promise's resolve / reject?

我理解了returnresolve之間的區別,但是我覺得我在用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM