这个问题困扰了我很长时间,所以我决定寻求帮助,我相信没有确定的答案,这可能是一个公开的讨论。
如果我有一个职能:
await
任何其他功能then
或catch
,这样就不会涉及进一步的异步流程此功能应该是async
吗?
例如:
async function updateUser(user) {
return await fetch('/some/url', {body: JSON.stringify(data)});
}
function growUp1(user) {
user.age++;
return updateUser(user);
}
async function growUp2(user) {
user.age++;
return await updateUser(user);
}
我认为growUp1
更简单,并且在babel转换后具有更好的性能(因为涉及的异步生成器更少),并且growUp2
在updateUser
之间切换时更健壮异步和同步。
我们是否应该强制执行:
async
async
功能,必须为async
或者只是让团队成员免费使用?
另一个问题可能是,如果一个函数只包含一些简单的then
调用承诺,它应该成为async
函数并在所有可能的情况下使用await
来消除{{ 1}}来电?
答案 0 :(得分:1)
我不会把它变成 package rc4_crc32;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
import java.util.zip.CRC32;
public class RC4_CRC32 {
public static void main(String[] args) throws Exception{
byte[] key, ciphertext;
CRC32 c = new CRC32();
javax.crypto.Cipher r;
r = Cipher.getInstance("RC4");
key = "1@m@L33tH@x0r!".getBytes("ASCII");
SecretKeySpec rc4Key = new SecretKeySpec(key, "RC4");
r.init(Cipher.ENCRYPT_MODE, rc4Key);
ciphertext = r.update("Secret!".getBytes("ASCII"));
c.update(ciphertext);
System.out.println("Ciphertext = " + ciphertext + ", and CRC = " + c.getValue());
ciphertext[0] = (byte)0x2c;
c.update(ciphertext);
System.out.println("Now ciphertext = " + ciphertext + ", and CRC = " + c.getValue());
c.update(ciphertext);
System.out.println("Now ciphertext = " + ciphertext + ", and CRC = " + c.getValue());
c.update(ciphertext);
System.out.println("Now ciphertext = " + ciphertext + ", and CRC = " + c.getValue());
c.update(ciphertext);
System.out.println("Now ciphertext = " + ciphertext + ", and CRC = " + c.getValue());
}
}
。当然,正常函数返回一个承诺仍应正确记录。
要考虑的重要事项是
async function
并不完全是identity function - 它实际上是Promise.resolve
函数。如果您等待async function f(x) {
return await x;
}
承诺并返回结果,那么您将无法返回x
,而是实际获得新承诺。这确实会产生一些开销(尽管它不太可能很重要)。
我们应该强制执行......
这取决于你的团队。如果您同意将x
关键字作为承诺返回函数的标记,并且您希望对此保持一致,那么只需将其包含在您的样式指南中并遵循该标准。
我个人认为这不是一个好主意,你不应该教条。仅在适当的地方使用async
。