所以,我遇到了问题。我需要进行数百次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调用完成后?这听起来“糟糕的做法”。
感谢您的帮助。
答案 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!');
})();