Sye*_*san 5 javascript async-await ecmascript-2017
我刚刚阅读async functions并发现了ES2017的一些类似功能.它造成了很多混乱,我想问一下:
async function,AsyncFunction和一个异步机能的研究表达式(这是用来创建一个异步函数),(这是我认为只是一个异步功能)?关于每个人的怪癖和表现的亮点将不胜感激!
有四种方法可以在Javascript中创建一个函数.在Javascript中还有四种创建异步函数的方法,它们是彼此的精确镜像.
为了演示这是如何工作的,我使用了一个sleep全局声明的简单函数:
function sleep(time) {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve();
}, time);
});
}
Run Code Online (Sandbox Code Playgroud)
function speak() { return 'Hi'; }
async function speak() { await sleep(1000); return 'Hi'; }
Run Code Online (Sandbox Code Playgroud)
这是声明函数的最简单方法.它可以声明一次,并提升到当前函数范围的顶部.
函数声明和异步函数声明完全相同,除了async函数总是返回一个promise并允许你使用await.
let speak = function() { return 'Hi'; } // anonymous function expression
let speak = function speakFn() { return 'Hi'; } // named function expression
let speak = async function() { await sleep(1000); return 'Hi'; } // anonymous asynchronous function expression
let speak = async function speakFn() { await sleep(1000); return 'Hi'; } // named asynchronous function expression
Run Code Online (Sandbox Code Playgroud)
函数表达式看起来非常像函数声明.但是,它们不会被提升到功能范围的顶部.它们可以根据您的喜好重新定义.它们可以内联定义.它们可以是匿名的或命名的:如果它们被命名,则名称指的是该函数范围内的函数.
函数表达式和异步函数表达式完全相同,只是async函数总是返回一个promise并允许你使用await.
let speak = word => 'Hi ' + word; // one parameter
let speak = (word1, word2) => 'Hi ' + word1 + word2; // multiple parameters
let speak = async word => { await sleep(1000); return 'Hi ' + word; } // one parameter
let speak = async (word1, word2) => { await sleep(1000); return 'Hi ' + word1 + word2; } // multiple parameters
Run Code Online (Sandbox Code Playgroud)
箭头功能是定义ES2015(ES6)中引入的功能的快捷方式.它们在很多方面等同于函数表达式,除了它们始终是匿名的,并且值this始终是词法绑定的,即从外部作用域继承.
箭头函数和异步箭头函数完全相同,只是async函数始终返回一个promise并允许您使用await.(它们在上面的语句中略有不同,因为异步函数每个都有多个语句.这意味着语句需要包含在一个块中{},并且return需要明确.这对于正常的箭头函数也是如此.不止一个陈述.)
let speak = new Function('word', 'return "Hi " + word;');
let speak = new AsyncFunction('word', 'await sleep(1000); return "Hi " + word;')
Run Code Online (Sandbox Code Playgroud)
函数构造函数允许您使用字符串动态定义函数.请注意,它们始终在全局范围内运行,并且无法访问定义它们的范围.它们仅在极少数情况下有用.我个人无法看到异步函数构造函数如何成为有用的东西.ES2017的作者同意我的观点,因为AsyncFunction它不是一个全球性的对象,必须首先获得const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor.
使用函数构造函数创建的函数和使用匿名函数构造函数创建的函数完全相同,只不过该async函数总是返回一个promise并允许您使用await.(但你已经猜到了,对吧?)
| 归档时间: |
|
| 查看次数: |
748 次 |
| 最近记录: |