javascript - 我可以通过 Promise 的解析/拒绝来控制函数的流程吗?

标签 javascript es6-promise

我理解 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 (...) { ...;返回; } …,但是 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/

相关文章:

php - 预订表格有效,但不提供反馈

javascript - 如何从组件内部找出哪些组件被单击

javascript - 使用 Twilio 对浏览器电话进行物理电话调用无法正常工作

javascript - Django 如何配置为管理员使用备用静态目录

node.js - 返回一个 Promise,无需等待 Node.js 函数中的依赖 Promise

javascript - Mocha : Error Timeout of 2000ms exceeded

javascript - 如何使用js Promise消除厄运金字塔

javascript - 我可以使用三元运算符来处理 promise 中的错误吗?

javascript - 如何使用 Promises 实现异步无限循环

javascript - 是否可以像在 Java 上那样从 JSTL 数组中更改获取变量值?