我是JavaScript异步行为概念的新手。
以下代码使我感到困惑。根据我的概念,b应该在wait函数完成执行之前返回,因为我没有告诉它使用'await'等待。 但是我得到的输出是这样的: 之前 然后等待6秒 后 在b
之后预期输出: 之前 后 b之后 无需等待6秒钟 这是代码:
function wait(ms)
{
var start = new Date().getTime();
var end = start;
while(end < start + ms) {
end = new Date().getTime();
}
}
async function b () {
console.log('before');
wait(6000);
console.log('after');
}
async function c () {
b()
console.log('after b');
}
c();
请帮助我更好地理解这个概念
答案 0 :(得分:2)
这很容易理解。函数wait()
是同步的。
async
关键字不会使函数异步。它仅允许您在标有await
的函数中使用async
关键字。
那么您怎么知道一个函数是否异步同步呢?最简单的方法是阅读文档。
Javascript几乎没有任何功能可以向您发出信号,无论该功能是同步的还是异步的。甚至回调的存在都不是信号。例如,Array.prototype.sort()
接受回调,但完全同步。 async
关键字是朝正确方向迈出的良好一步,可以预示一个函数是异步的,但是正如您自己所展示的那样,关键字取决于函数的作者了解async
关键字的作用。>
好处是,与其他语言(例如Java或C ++)不同,JavaScript中的文档往往非常出色,因为通常没有自动文档(即使您在js中使用自动文档系统,也需要手动为其编写注释)。在README文件中编写详细,清晰的文档是一种普遍的文化,以便npm为图书馆的用户选择。
那么如何在javascript中编写一个异步函数呢?
通常只有两种方法可以做到:
使用异步功能。例如setTimeout()
或fetch()
:
function waitOneSecond () {
return new Promise(functionn (ok,err) {
setTimeout(ok,1000);
});
}
用C编写。对于node.js,您可以使用Addons API在C / C ++(https://nodejs.org/api/addons.html)中实现模块,Chrome具有NaCl(https://developer.chrome.com/native-client)等。已实现setTimeout()
,fetch()
等功能。
答案 1 :(得分:1)
请参见以下示例:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function。
如前所述,async
关键字允许您使用await。从技术上讲,它还有更多功能,但是现在让我们省略。
该示例显示了Promise
(确实允许异步编程),async
函数await
在对其进行解析之前要对其进行解析。基本上,await
允许您在处理异步函数时编写同步代码。
尝试使用示例(例如,删除等待)。这将导致代码不等待promise并返回promise,而不是promise的resolve值。
如果您想涉足异步编程,那么最好的选择就是涉足Promise
个。这些为您提供了这样做的界面。
这个概念很简单。您要做一些工作,并在完成时调用回调(成功时解决,失败时拒绝)。了解界面可能会有些困难,但是MDN拥有丰富的文档:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise。