我们什么时候应该将函数定义为async

时间:2015-06-02 16:25:59

标签: javascript async-await ecmascript-harmony

这个问题困扰了我很长时间,所以我决定寻求帮助,我相信没有确定的答案,这可能是一个公开的讨论。

如果我有一个职能:

  1. 返回承诺
  2. 不需要await任何其他功能
  3. 不要自己创建承诺,只返回另一个函数返回的承诺
  4. 不要在承诺上调用thencatch,这样就不会涉及进一步的异步流程
  5. 此功能应该是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转换后具有更好的性能(因为涉及的异步生成器更少),并且growUp2updateUser之间切换时更健壮异步和同步。

    我们是否应该强制执行:

    1. 如果某个函数返回Promise,必须async
    2. 如果某个功能取决于async功能,必须async
    3. 或者只是让团队成员免费使用?

      另一个问题可能是,如果一个函数只包含一些简单的then调用承诺,它应该成为async函数并在所有可能的情况下使用await来消除{{ 1}}来电?

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