可以推迟分配并继续执行当前块吗?
Can assignments be deferred and execution of current block continue?
我得到了一些解释 JS 中异步事件的教育文献...
Take the following example where, server1 is a different server to the one running the website and the getData() function will execute a complex SQL query and then return a large dataset:
var data = server1.getData();
console.log(data);
We can be almost certain that the console will say undefined
. This is because the 2nd line of code will be executed before the result of getData() is returned.
我的理解是第二行只会在 then 函数 returned 并且它的 return 值被分配给 data
时执行。如果确实是 getData() returns 'a large dataset',那么当我们到达第二行时 data
将是 'a large dataset'.
作业可以这样延期吗?我非常熟悉对远程服务器的异步调用并通过回调处理它们。但是我相信在 JS 中一个简单的函数调用将 return 一次(最多)并且代码本质上是单线程执行和顺序执行的。
尽管本意是好的,但该文档试图解释异步编程的缺陷是否有点误导?
该文档可能具有误导性,或者是故意试图提出一种无法正常工作的情况,以解释为什么它无法正常工作...我无论如何都会称之为误导。
JavaScript 是单线程的 - 因此从事件队列中的任何调用必须 运行 完成并且 return 到事件队列(任务管理器)才能开始另一个调用。
var data = server1.getData();
console.log(data);
可以 return一大组数据,当且仅当获取数据被请求为同步操作,并进一步提供服务器"server1" 允许 cross origin requests (假定 "different server" 表示不同的域、协议或端口)。严重不鼓励同步数据请求,因为它们会停止网页响应,直到请求完成。如果以这种方式编码,data
的值将只是 undefined
它故意选择作为值来指示 "no data available"。
ECMAScript 2017 中引入的 await
运算符 可以 等待异步结果的承诺实现,并延迟将结果赋值给变量。但是用法如
var data = await server1.getData();
console.log(data);`
有一些限制阻止它在示例中使用:它只能在 async
函数内部使用,并且 async
函数 return Promise 对象。所以即使 server1.getData
方法被写成 async
函数,并且内部使用 await
等待数据到达,将它分配给一个变量然后 return 如果从函数,async
函数的 return 值对它的调用者来说 不是 returned 而是用来实现它 return 的承诺在实际拨打电话时编辑。
server1.getData().then( data=>console.log(data)).catch(err=>console.error(err));
如果 getData
return 是一个承诺,异步操作可能如何编码才能工作。如果被调用,.then
和 .catch
提供的回调函数会在一段时间后异步调用。这意味着执行上述行的代码可以 return 进入事件循环,并在查询结果发送回请求网页之前让其他事情发生。
至于
We can be almost certain that the console will say undefined.
使用提供的代码?不。更有可能在当前(ECMA 脚本版本 6 或更高版本兼容)浏览器的代码中,我们几乎可以肯定控制台会说 Promise { <state>: "pending" }
或类似的。
我得到了一些解释 JS 中异步事件的教育文献...
Take the following example where, server1 is a different server to the one running the website and the getData() function will execute a complex SQL query and then return a large dataset:
var data = server1.getData();
console.log(data);
We can be almost certain that the console will say
undefined
. This is because the 2nd line of code will be executed before the result of getData() is returned.
我的理解是第二行只会在 then 函数 returned 并且它的 return 值被分配给 data
时执行。如果确实是 getData() returns 'a large dataset',那么当我们到达第二行时 data
将是 'a large dataset'.
作业可以这样延期吗?我非常熟悉对远程服务器的异步调用并通过回调处理它们。但是我相信在 JS 中一个简单的函数调用将 return 一次(最多)并且代码本质上是单线程执行和顺序执行的。
尽管本意是好的,但该文档试图解释异步编程的缺陷是否有点误导?
该文档可能具有误导性,或者是故意试图提出一种无法正常工作的情况,以解释为什么它无法正常工作...我无论如何都会称之为误导。
JavaScript 是单线程的 - 因此从事件队列中的任何调用必须 运行 完成并且 return 到事件队列(任务管理器)才能开始另一个调用。
var data = server1.getData();
console.log(data);
可以 return一大组数据,当且仅当获取数据被请求为同步操作,并进一步提供服务器"server1" 允许 cross origin requests (假定 "different server" 表示不同的域、协议或端口)。严重不鼓励同步数据请求,因为它们会停止网页响应,直到请求完成。如果以这种方式编码,data
的值将只是 undefined
它故意选择作为值来指示 "no data available"。
ECMAScript 2017 中引入的 await
运算符 可以 等待异步结果的承诺实现,并延迟将结果赋值给变量。但是用法如
var data = await server1.getData();
console.log(data);`
有一些限制阻止它在示例中使用:它只能在 async
函数内部使用,并且 async
函数 return Promise 对象。所以即使 server1.getData
方法被写成 async
函数,并且内部使用 await
等待数据到达,将它分配给一个变量然后 return 如果从函数,async
函数的 return 值对它的调用者来说 不是 returned 而是用来实现它 return 的承诺在实际拨打电话时编辑。
server1.getData().then( data=>console.log(data)).catch(err=>console.error(err));
如果 getData
return 是一个承诺,异步操作可能如何编码才能工作。如果被调用,.then
和 .catch
提供的回调函数会在一段时间后异步调用。这意味着执行上述行的代码可以 return 进入事件循环,并在查询结果发送回请求网页之前让其他事情发生。
至于
We can be almost certain that the console will say undefined.
使用提供的代码?不。更有可能在当前(ECMA 脚本版本 6 或更高版本兼容)浏览器的代码中,我们几乎可以肯定控制台会说 Promise { <state>: "pending" }
或类似的。