我对目前关于将async函数和关键字添加await到下一个EcmaScript的讨论感到困惑.
我不明白为什么有必要在async关键字之前使用function关键字.
从我的观点来看,await关键字等待发电机或承诺的结果做一个函数的return应该是足够的.
await应该在普通函数和生成器函数中简单可用,无需额外的async标记.
如果我需要创建一个函数作为结果应该可用await,我只需使用一个promise.
我的理由是这个很好的解释,下面的例子来自:
async function setupNewUser(name) {
var invitations,
newUser = await createUser(name),
friends = await getFacebookFriends(name);
if (friends) {
invitations = await inviteFacebookFriends(friends);
}
// some more logic
}
Run Code Online (Sandbox Code Playgroud)
它也可以作为普通函数完成,如果函数的执行将等待完成孔函数,直到满足所有等待.
function setupNewUser(name) {
var invitations,
newUser = await createUser(name),
friends = await getFacebookFriends(name);
if (friends) {
invitations = await inviteFacebookFriends(friends);
}
// return because createUser() and getFacebookFriends() …Run Code Online (Sandbox Code Playgroud) 为什么使用await需要声明的外部函数async?
例如,为什么这个mongoose语句需要它返回一个promise的函数?
async function middleware(hostname, done) {
try {
let team = await Teams.findOne({ hostnames: hostname.toLowerCase() }).exec();
done(null, team);
} catch (err) { done(err); }
}
Run Code Online (Sandbox Code Playgroud)
我看到运行时/转换器解析了团队对它的价值的承诺和异步信号,它"抛出"被拒绝的承诺.
但是try/catch"捕获"那些被拒绝的承诺,那么为什么异步并等待如此紧密耦合呢?
await 的可能重复 仅在 async 函数中有效。
我是新手NodeJS,我发现这个概念async-await有点混乱。经过一些阅读和混乱之后,这就是我的理解。
假设,我有一个sum这样的功能。
function sum(a, b) {
// print the numbers
for (var i = 0; i < 100000; i++) {
console.log(i);
}
// settimeout
new Promise (resolve => {
setTimeout(resolve, 1000);
});
return a+b;
}
function main() {
let a = sum(5,2);
console.log(a);
}
main();
Run Code Online (Sandbox Code Playgroud)
它为计时器分配一个新线程并继续正常流程。它首先打印所有数字,返回a 7,然后在退出前等待1 秒。
但是现在我想按照它们的写入顺序执行这些行。await在 timer 之前放置一个关键字是有意义的Promise。
async function sum(a, b) {
// print the numbers
for (var …Run Code Online (Sandbox Code Playgroud) 例如,为什么下面的函数需要"async"..是不是使用等待特定的足够的编译器来解析代码而没有歧义?
# Why do we need async here
async function foo() {
var user = await getUser(user_id);
console.log(user);
}
Run Code Online (Sandbox Code Playgroud)
是出于向后兼容的原因吗?(我想不出任何在标准Javascript中使用await键盘的代码..)?
是否主要是为了清楚地表明此函数使用新的async关键字?谢谢
我只想等待一个进程完成,不想让函数异步.
请参阅以下代码.
我不得不使getUserList异步,因为函数中有一个await关键字.因此,我还必须编写"await UsersService.getUserList"来执行该方法,并且我必须使父函数异步.那不是我想要做的.
import xr from 'xr' //a package for http requests
class UsersService {
static async getUserList() {
const res = await xr.get('http://localhost/api/users')
return res.data
}
}
export default UsersService
Run Code Online (Sandbox Code Playgroud)
import UsersService from './UsersService'
class SomeClass {
async someFunction() { //async again!!
const users = await UsersService.getUserList() //await again!!
}
}
Run Code Online (Sandbox Code Playgroud) 我目前正在学习 Dart,但这也适用于现在 JavaScript 世界中发生的事情,而且 C# 似乎也使用相同的模式。
在 Dart 中,任何使用的函数await本身都必须通过async以下方式标记为异步:
import "dart:html";
main() async {
var context = querySelector("canvas").context2D;
var running = true;
while (running) {
var time = await window.animationFrame;
...
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义。如果一个函数正在等待一个异步函数完成,那么它不是被认为是阻塞的吗?为什么 JS 和 Dart 要求将其标记为异步?不会适得其反吧?
对我来说,如果调用函数在async调用任何在其定义中也包含它的函数时必须使用关键字,那将更有意义。在这种模式中,await将用于将异步函数转换为同步函数。
这种方式也可以避免重复的功能,因为现在,库似乎总是有func()andfuncSync()或funcAsync()。
javascript ×6
async-await ×5
asynchronous ×3
babeljs ×1
dart ×1
ecmascript-6 ×1
node.js ×1
promise ×1