Javascript 一个接一个地执行承诺(或延期),并且能够随时中断

Javascript 一个接一个地执行承诺(或延期),并且能够随时中断,javascript,jquery,promise,Javascript,Jquery,Promise,所以,我有个问题。我可能需要进行数百次http调用,而且这些调用必须一个接一个地完成。我还需要能够随时中断整个过程 我现在使用的解决方案是这个,但它不允许我正确地中断“链”(我使用jQuery和延迟,因为我还没有学会用承诺代替它们): (我找到了这个解决方案) 这里的问题是,打破reduce函数的唯一方法是修改正在循环的数组,检查特定值,并在找到该值时始终立即返回,而不是执行“doAnHttpCall”方法(在本例中)。这仍然会让我在数组中的数百个元素上循环,而不是仅仅中断这个过程,这是非常难看

所以,我有个问题。我可能需要进行数百次http调用,而且这些调用必须一个接一个地完成。我还需要能够随时中断整个过程

我现在使用的解决方案是这个,但它不允许我正确地中断“链”(我使用jQuery和延迟,因为我还没有学会用承诺代替它们):

(我找到了这个解决方案)

这里的问题是,打破
reduce
函数的唯一方法是修改正在循环的数组,检查特定值,并在找到该值时始终立即返回,而不是执行“doAnHttpCall”方法(在本例中)。这仍然会让我在数组中的数百个元素上循环,而不是仅仅中断这个过程,这是非常难看的

必须有更好的方法来做到这一点。或者,我真的需要使用一个函数,当http调用完成时,该函数通过下一个要处理的元素调用自己?听起来是“坏习惯”


谢谢您的帮助。

您可以使用
async
/
wait

const request = param => $.post('http://the.domain/theendpoint', { param });

(async () => {
  for(const param of ['param1', 'param2', 'param3']) {
    let result = await request(param);
    if (result === 'particular value') break;
  }
  console.log('all done!');
})();

改用递归方法。没有什么会使它成为一种不好的做法。
必须有更好的方法来做到这一点
是的,使用
异步
/
等待
。Break的工作原理和您预期的一样。这最好是通过递归排序来完成的,因为reduce方法将一直运行到最后
async/await
是一种命令式抽象,您可以使用
while
循环和终止条件来停止循环。是的,谢谢大家。我正在尝试使用
async
await
,一旦我成功地测试了各种场景,我将向您报告。是的,这正是我需要做的,谢谢。另外,对于那些不知道的人,您可以通过返回某个内容(这将触发
。然后
)或抛出一个错误(这将触发
。catch
)来中断循环。
const request = param => $.post('http://the.domain/theendpoint', { param });

(async () => {
  for(const param of ['param1', 'param2', 'param3']) {
    let result = await request(param);
    if (result === 'particular value') break;
  }
  console.log('all done!');
})();