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

标签 javascript jquery promise

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

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

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 调用完成时处理下一个元素?这听起来是“不好的做法”。

感谢您的帮助。

最佳答案

您将使用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!');
})();

关于javascript - 一个接一个地执行 Promise(或 Deferreds),并且能够随时中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49968426/

相关文章:

javascript - 为什么我不能在 react.js 中将值推送到我的状态数组中?

javascript - 动态表格多个输入字段计算

javascript - 在 Q promises 中,为什么会立即调用 fall?

javascript - 如何检查属性是否是 Javascript 中的函数

javascript - 如何在 RxJS 中创建一个可观察量,它等待 2 个可观察量(按顺序),然​​后执行操作,然后再次按顺序等待这 2 个可观察量

javascript - 如何使用 Mocha Chai Sinon 检查元素是否存在?

javascript - 在悬停和单击链接时替换图像

javascript - jQuery 滑动限制

JavaScript promise 混淆

javascript - 使用 router.js 上的 Promise 模拟错误处理