Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
想要澄清一下异步javascript代码与同步代码的区别吗_Javascript_Asynchronous - Fatal编程技术网

想要澄清一下异步javascript代码与同步代码的区别吗

想要澄清一下异步javascript代码与同步代码的区别吗,javascript,asynchronous,Javascript,Asynchronous,正常的同步方式做事情是好的和直接的 函数接受输入 该函数使用这些输入执行操作 函数弹出一个值(返回一个值) 弹出的值可以存储到变量中,直接用于同步代码的其他部分,等等 但async似乎无法做到这一点 假设我有一项服务,我想出售。服务的价格因地点而异 我有一个用户: 输入邮政编码 邮政编码发送到API,同时返回城市名称 我使用城市名称来运行一个超大型函数,该函数返回一个价格 然后我想在我的同步代码的其他部分中使用price,而同步代码是超长的,并且跨越了许多函数,这些函数都依赖于price值

正常的同步方式做事情是好的和直接的

  • 函数接受输入
  • 该函数使用这些输入执行操作
  • 函数弹出一个值(返回一个值)
  • 弹出的值可以存储到变量中,直接用于同步代码的其他部分,等等
但async似乎无法做到这一点

假设我有一项服务,我想出售。服务的价格因地点而异

我有一个用户:

  • 输入邮政编码
  • 邮政编码发送到API,同时返回城市名称
  • 我使用城市名称来运行一个超大型函数,该函数返回一个价格
  • 然后我想在我的同步代码的其他部分中使用price,而同步代码是超长的,并且跨越了许多函数,这些函数都依赖于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);
});