假设我有一个包含邮政编码的大文件,每行一个,以及一个返回zip区域当前温度的HTTP服务。
我想在HTTP服务请求之间实现延迟,比如1s。但是,如果我异步读取文件,并且行可以异步到达,那么在处理每一行时如何确保强制执行延迟?
在这种情况下,我是否必须保持同步以强制执行HTTP请求之间的延迟?
答案 0 :(得分:0)
您可能正在寻找Javascript Promises
当Javascript承诺未决时,它可以转换为已履行或已拒绝的状态。然而,一旦承诺得到履行或拒绝,它将永远不会转移到任何其他州,其价值或失败原因不会改变。
与传统的基于回调的方法相比, Javascript Promises
为执行,组合和管理异步操作提供了一种更简单的替代方法。它们还允许您使用类似于同步try / catch的方法来处理异步错误。
承诺可以是以下三种状态之一:
Pending
- 承诺的结果尚未确定,因为
将产生其结果的异步操作没有
完成了。Fulfilled
- 异步操作已完成,并且是promise
有价值。Rejected
- 异步操作失败,承诺将失败
永远不会实现。在被拒绝的状态下,承诺是有原因的
这表明操作失败的原因。下面的示例是执行承诺,延迟为1秒。
<!DOCTYPE html>
<html>
<body>
<script>
function getSum(n1, n2) {
var isAnyNegative = function() {
return n1 < 0 || n2 < 0;
}
return new Promise(function(resolve) {
setTimeout(function() {
if (isAnyNegative()) {
reject(Error("Negatives not supported"));
}
resolve(n1 + n2);
}, 1000);
})
}
try {
getSum(5, 6)
.then(function(result) {
console.log(result);
return getSum(10, 20); //this returns another Promise
}, function(error) {console.log(error);})
.then(function(result) {
console.log(result);
return getSum(30, 40); //this returns another Promise
}, function(error) {console.log(error);})
.then(function(result) {
console.log(result);
}, function(error) {console.log(error);})
}
catch(err) {
console.log(err);
}
</script>
</body>
</html>