什么功能应该是同步/异步的?

时间:2018-01-09 14:16:36

标签: javascript node.js asynchronous async-await

假设我有一个包含邮政编码的大文件,每行一个,以及一个返回zip区域当前温度的HTTP服务。

我想在HTTP服务请求之间实现延迟,比如1s。但是,如果我异步读取文件,并且行可以异步到达,那么在处理每一行时如何确保强制执行延迟?

在这种情况下,我是否必须保持同步以强制执行HTTP请求之间的延迟?

1 个答案:

答案 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>

  

Read Javascript Promises