2015-09-03 23 views
2

我願與巴別塔運行這段代碼:我可以在nodejs(ES7)中觸發並忘記承諾嗎?

redisClientAsync.delAsync('key'); 
return await someOtherAsyncFunction(); 

異步函數內部沒有等待的第一道防線。這個可以嗎?

我該怎麼辦我不在乎的東西?

我可以在沒有回調的情況下觸發非promisified函數del('key',null)嗎?

+0

這是OK,只要在運行之前異步調用完成它不退出的過程。 – mostruash

+0

你在使用Babel嗎?這是一個ES7功能。 – MinusFour

+0

@MinusFour是的,我正在使用babel – arisalexis

回答

6

是的,你可以做到這一點,它會並行運行兩個異步功能。你剛剛創造了一個承諾並將其拋棄。

但是,這意味着當承諾被拒絕時,您不會注意到。你只會get an unhandledRejection eventually

可以嗎?我如何運行一些我不在乎的東西?

大概不是這樣。如果你真的不在意,那麼你並沒有把它放在第一位。所以你應該清楚明確你關心什麼(以及什麼不):

  • 你想等待嗎? (用於副作用)
  • 你需要結果嗎?
  • 你想捕捉異常嗎?

如果你只是想等待,不在乎結果值,你可以很容易地扔掉結果:

void (await someAsyncFunction()); // or omit the void keyword, 
            // doesn't make a difference in an expression statement 

如果你不關心異常,你可以忽略它們使用

… someAsyncFunction().catch(function ignore() {}) … 

你可以扔掉它,等待它,用它做任何事情。

如果你想得到結果,你必須等待它。如果你關心異常,但真的不希望等待,可能要並行具有以下功能執行:

var [_, res] = await Promise.all([ 
    someAsyncFunction(), // result is ignored, exceptions aren't 
    someOtherAsyncFunction() 
]); 
return res; 
+0

謝謝你的全面。如果我不想要結果,那麼錯誤和我不想等待什麼是異步函數中最好的。運行承諾或運行正常的函數(非promisified)與null(或函數沒有做任何事)回調? – arisalexis

+0

在這種情況下,您可能會忽略promisification。我仍然會傳遞一個明確不做任何事情的回調,以表明它是異步的,但是你忽略了錯誤。 – Bergi

+0

下一個。如果解決了,那麼會被調用嗎?我不想要它。 – mylord

1

異步函數內部沒有等待第一道防線。這個可以嗎?

是的,有些情況下您想要這樣做是完全合理的。特別是在您不關心結果的情況下 - 一個例子是不應干擾業務關鍵代碼的分析跟蹤操作。

我該如何運行一些我不關心的東西?

在許多方面,只是簡單地調用promise函數。沒有回調的del在這種情況下可能會起作用,但某些函數不會阻止未傳遞迴調,因此您可以傳遞一個空函數(.del('key',() => {}))。

你想但是,應確保您知道它失敗了,即使你不想破壞代碼的操作 - 所以請考慮增加一個process.on("unhandledRejection',事件處理程序明確忽略這些特殊的例外或抑制他們通過:

redisClient.delAsync('key').catch(()=>{}); 

或者最好是這樣的:

redisClient.delAsync('key').catch(logErr);