Javascript 是否可以推迟分配并继续执行当前块?

Javascript 是否可以推迟分配并继续执行当前块?,javascript,asynchronous,deferred-execution,Javascript,Asynchronous,Deferred Execution,我收到了一些教育文献,解释了JS中的异步事件 以下面的示例为例,其中server1与运行网站的服务器不同,getData()函数将执行一个复杂的SQL查询,然后返回一个大数据集: 我们几乎可以肯定,控制台将显示未定义。这是因为第二行代码将在返回getData()的结果之前执行 我的理解是,只有当then函数返回并且其返回值被分配给数据时,才会执行第2行。如果getData()确实返回“一个大数据集”,那么当我们到达第二行时,data将是“一个大数据集” 任务可以这样延期吗?我非常熟悉对远程服务器

我收到了一些教育文献,解释了JS中的异步事件

以下面的示例为例,其中server1与运行网站的服务器不同,getData()函数将执行一个复杂的SQL查询,然后返回一个大数据集:

我们几乎可以肯定,控制台将显示
未定义
。这是因为第二行代码将在返回getData()的结果之前执行

我的理解是,只有当then函数返回并且其返回值被分配给
数据时,才会执行第2行。如果getData()确实返回“一个大数据集”,那么当我们到达第二行时,
data
将是“一个大数据集”

任务可以这样延期吗?我非常熟悉对远程服务器的异步调用,并通过回调处理它们。但我相信JS中的一个简单函数调用将返回一次(最多),代码基本上是单线程和顺序执行的


本文档在解释异步编程的陷阱时是否有些误导,无论其用意有多好

这些文档可能会产生误导,也可能是故意制造一种不起作用的情况,以解释为什么它不起作用。。。我认为这是误导

JavaScript是单线程的——因此,事件队列中的任何调用都必须运行到完成并返回到事件队列(任务管理器),然后才能开始另一个调用

 var data = server1.getData();  
 console.log(data);
可以返回大量数据,如果且仅当作为同步操作请求获取数据,并且服务器“server1”允许(假定“不同的服务器”表示不同的域、协议或端口)。同步数据请求被严重阻止,因为它们会停止网页响应,直到请求完成。如果以这种方式编码,
数据
的值只会是
未定义的
它故意选择作为一个值来表示“无可用数据”

ECMAScript 2017中引入的
wait
运算符可以等待异步结果的承诺实现,并延迟将结果分配给变量。但是用法如

var data = await server1.getData();
console.log(data);`
具有阻止在示例中使用它的限制:它只能在
async
函数中使用,并且
async
函数返回承诺对象。因此,即使
server1.getData
方法被编写为
async
函数,并在内部使用
wait
等待数据到达,也要将其分配给变量,然后从函数返回if,
async
函数的返回值未返回给调用方,但用于履行实际调用时返回的承诺

server1.getData().then( data=>console.log(data)).catch(err=>console.error(err));
是当
getData
返回承诺时,异步操作的编码方式。如果调用,
提供的回调函数,那么
catch
将在一段时间后异步调用。这意味着执行上述行的代码可以返回到事件循环,并在将查询结果发送回请求网页之前让其他事情发生

至于

我们几乎可以肯定,控制台将显示undefined


使用提供的代码?不。在当前(ECMA脚本版本6或更高版本兼容)浏览器的代码中,我们几乎可以肯定控制台会说
Promise{:“pending”}
或类似内容。

不,不能推迟分配。我不知道你在读什么,但这是一个很糟糕的例子。你可以用
async/await
()做延迟赋值,但我在你的代码片段中没有看到这些关键字。@chiliNUT-
async/await不是标准的js,我认为它是ES7草案的一部分
——我认为您会发现async/await是ES2017规范的一部分——这是一个标准,而不是草案:p另外,我认为ES2017更像ES8。。。ES6=ES2015、ES7=ES2016和ES8=ES2017(人们应该停止使用ES6/7/8而不是ESyyyy:p)顺便说一句@chiliNUT——MDN上
async
中的第一个链接确实指向草稿,但这是ES2018草稿:p——就“受教育”而言,我希望你没有冒犯,如果ES6=2016,ES7=2017等,记住哪一个ES是哪一年会更容易一些:p但我总是弄错哪一个ES?==此示例位于介绍承诺的一节的开头。公平地说,本课程不是一门“js”课程,但需要覆盖一些js基础知识,以获得真正的内容。我只是看到了这段代码,我想“这可能是对的吗?”,我用Teach提出了这段代码,他用了一些更复杂的例子为它辩护。我还在发牢骚,但还是算了吧(因为我已经长大成人了):我正在等待一些有趣的东西。对于返回数据的函数,甚至是返回数据速度较慢的函数,我都没有问题。但是我确实对第二行在第一行中的函数调用返回之前执行的语句有问题。即使在wait示例中,函数也返回了一个承诺。根据我的理解,在所示的示例中,getData()必须返回未定义的(或根本没有返回语句)。可能“第二行代码将在返回getData()的结果之前执行。”措词不当,表示“在运行查询后从其他服务器返回”。正如您所说,如果
getData
启动一个异步请求并返回,那么返回值将是未定义的,当然不是数据。我怀疑这篇文章是在讨论从异步完成回调返回数据到事件循环(忽略它)的代码白痴,期望返回值及时跳回并最终作为返回值结束
server1.getData().then( data=>console.log(data)).catch(err=>console.error(err));