首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我能用Promise的resolve / reject来控制函数的流程吗?

我能用Promise的resolve / reject来控制函数的流程吗?
EN

Stack Overflow用户
提问于 2019-08-15 18:49:46
回答 2查看 36关注 0票数 0

我理解returnresolve之间的区别,但我觉得我在用return乱丢代码,因为我需要基于逻辑立即解决或拒绝的承诺。

下面是我的实际代码:

代码语言:javascript
复制
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语句把所有的东西都弄乱了?

EN

回答 2

Stack Overflow用户

发布于 2019-08-15 19:30:10

只是不要使用if (…) { …; return; } …,而是使用if (…) { … } else { … }

代码语言:javascript
复制
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,因为它会完全避开您的问题:

代码语言:javascript
复制
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();
票数 1
EN

Stack Overflow用户

发布于 2019-08-15 20:14:15

Promise.all()是返回项目的函数的最佳选择。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57508518

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档