想要澄清一下异步javascript代码与同步代码的区别吗
正常的同步方式做事情是好的和直接的想要澄清一下异步javascript代码与同步代码的区别吗,javascript,asynchronous,Javascript,Asynchronous,正常的同步方式做事情是好的和直接的 函数接受输入 该函数使用这些输入执行操作 函数弹出一个值(返回一个值) 弹出的值可以存储到变量中,直接用于同步代码的其他部分,等等 但async似乎无法做到这一点 假设我有一项服务,我想出售。服务的价格因地点而异 我有一个用户: 输入邮政编码 邮政编码发送到API,同时返回城市名称 我使用城市名称来运行一个超大型函数,该函数返回一个价格 然后我想在我的同步代码的其他部分中使用price,而同步代码是超长的,并且跨越了许多函数,这些函数都依赖于price值
- 函数接受输入
- 该函数使用这些输入执行操作
- 函数弹出一个值(返回一个值)
- 弹出的值可以存储到变量中,直接用于同步代码的其他部分,等等
- 输入邮政编码
- 邮政编码发送到API,同时返回城市名称
- 我使用城市名称来运行一个超大型函数,该函数返回一个价格
- 然后我想在我的同步代码的其他部分中使用price,而同步代码是超长的,并且跨越了许多函数,这些函数都依赖于price值
calcPrice
中的值永远不会返回,因此永远不会存储到price变量中。calcPrice
的值永远卡在代码流的异步分支中,这迫使我在异步分支/回调中执行所有其他相关处理
所以有几个问题:
- 异步代码永远无法将值返回到同步代码中,这是否正确?正常的做事和思考的同步方式是行不通的
- 胖回调很正常吗
我可以选择Promise路线,但如果我这样做,我只是将所有相关处理填充到我的
函数中,
函数。。。它看起来有点干净,但仍然嵌套在其他东西的深处。异步代码永远无法将值返回到同步代码中,这是正确的吗?
是的,差不多。但这取决于环境。例如:在浏览器中,像requirejs这样的文件依赖库依赖于异步流。然而,在NodeJS中,他们对其进行了抽象,以便您能够以同步方式获取依赖项(就像您在Java中使用Import一样)
如果您需要从另一个Web服务或数据库获取资源,则可能始终需要回调。这是因为javascript引擎的异步特性。每当脚本从底层环境(例如浏览器)请求资源时,脚本执行不会停止。因此,您可以同时执行多个异步请求
fat回调非常正常吗?
这取决于您的偏好和代码样式。如果它可读且可维护,为什么不应该有一个fat回调?不过,很多人会认为这并不干净。就我个人而言,我更喜欢通过实现承诺之类的东西来实现一个更扁平的体系结构。所以对我的三个问题回答“是”、“是”和“是”?谢谢你的回答!是的,我认为承诺是两害中较小的。另一方面,您是否遇到过浏览器不支持承诺的任何重大问题?Promises上的官方MDN文档有一个很大的免责声明,那就是它是实验性的技术。有各种Promises库不依赖实验性的浏览器功能。几个臭名昭著的例子是:Q()和jquerydeferred()。另外,我没有提到
XMLHTTPRequest
确实有一个参数使请求同步,但是如果请求超时,这可能会给您带来其他各种麻烦。哈哈,它们是臭名昭著的吗?所以离他们远点?我是说流行语,英语不是我的母语。关于这两个方面的大量文档,如果您使用jQuery一个,那么它基本上是嵌入到AJAX包装器中的。
var calcPrice = function(city){
// stuff runs
return price;
};
// Async Function, taken from http://www.zippopotam.us/
// The "place name" is the city.
var returnLocationInfoByZip = function(zip, callback){
var client = new XMLHttpRequest();
var response;
client.open("GET", "http://api.zippopotam.us/us/" + zip, true);
client.onreadystatechange = function() {
if(client.readyState == 4) {
response = client.responseText;
callback(JSON.parse(response));
};
};
client.send();
};
var zip = "94043";
var price = returnLocationInfoByZip(zip, function(response){
calcPrice(response.places[0]["place name"]);
});
// This does not work. I'm going to call this the "dependent processing" part of my code.
functionThatDependsOnPrice(price);
AnotherFunctionThatDependsOnPrice(price);
MoreFunctionsThatDependsOnPrice(price);
EvenMoreFunctionsThatDependOnPrice(price);
// This I THINK would work instead
returnLocationInfoByZip(zip, function(response){
price = calcPrice( response.places[0]["place name"] );
functionThatDependsOnPrice(price);
AnotherFunctionThatDependsOnPrice(price);
MoreFunctionsThatDependsOnPrice(price);
EvenMoreFunctionsThatDependOnPrice(price);
});