一个接一个地执行Promises(或Deferreds),并且能够随时中断

时间:2018-04-22 16:51:33

标签: javascript jquery promise

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

我现在使用的解决方案是这个,但它不允许我正确地中断“链”(我使用jQuery和Deferreds因为我还没学会用Promises替换它们):< / p>

function doAnHttpCall() {
    return $.post('http://the.domain/theendpoint', { theParam: this });
}

var anArrayOfParams = ['param1', 'param2', 'param3'];

var p = $.Deferred();
setTimeout(p.resolve.bind(p), 0);

var promise = anArrayOfParams.reduce(function(prev, cur) {
    return prev.then(doAnHttpCall.bind(cur));
}, p)
.done(function() {
    console.log('all done.');
});

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

这里的问题是,排除reduce函数的唯一方法是修改您循环的数组并检查特定值,并在找到时立即返回,而不是执行“doAnHttpCall”方法(在这种情况下)。这仍然会让我循环遍历数组的数百个元素,而不仅仅是中断进程,这非常难看。

必须有更好的方法来做到这一点。或者我真的需要使用一个函数来调用自己的下一个元素来处理http调用完成后?这听起来“糟糕的做法”。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用async / await

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!');
})();