我願與巴別塔運行這段代碼:我可以在nodejs(ES7)中觸發並忘記承諾嗎?
redisClientAsync.delAsync('key');
return await someOtherAsyncFunction();
異步函數內部沒有等待的第一道防線。這個可以嗎?
我該怎麼辦我不在乎的東西?
我可以在沒有回調的情況下觸發非promisified函數del('key',null)嗎?
我願與巴別塔運行這段代碼:我可以在nodejs(ES7)中觸發並忘記承諾嗎?
redisClientAsync.delAsync('key');
return await someOtherAsyncFunction();
異步函數內部沒有等待的第一道防線。這個可以嗎?
我該怎麼辦我不在乎的東西?
我可以在沒有回調的情況下觸發非promisified函數del('key',null)嗎?
是的,你可以做到這一點,它會並行運行兩個異步功能。你剛剛創造了一個承諾並將其拋棄。
但是,這意味着當承諾被拒絕時,您不會注意到。你只會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;
謝謝你的全面。如果我不想要結果,那麼錯誤和我不想等待什麼是異步函數中最好的。運行承諾或運行正常的函數(非promisified)與null(或函數沒有做任何事)回調? – arisalexis
在這種情況下,您可能會忽略promisification。我仍然會傳遞一個明確不做任何事情的回調,以表明它是異步的,但是你忽略了錯誤。 – Bergi
下一個。如果解決了,那麼會被調用嗎?我不想要它。 – mylord
異步函數內部沒有等待第一道防線。這個可以嗎?
是的,有些情況下您想要這樣做是完全合理的。特別是在您不關心結果的情況下 - 一個例子是不應干擾業務關鍵代碼的分析跟蹤操作。
我該如何運行一些我不關心的東西?
在許多方面,只是簡單地調用promise函數。沒有回調的del
在這種情況下可能會起作用,但某些函數不會阻止未傳遞迴調,因此您可以傳遞一個空函數(.del('key',() => {})
)。
你想但是,應確保您知道它失敗了,即使你不想破壞代碼的操作 - 所以請考慮增加一個process.on("unhandledRejection',
事件處理程序明確忽略這些特殊的例外或抑制他們通過:
redisClient.delAsync('key').catch(()=>{});
或者最好是這樣的:
redisClient.delAsync('key').catch(logErr);
這是OK,只要在運行之前異步調用完成它不退出的過程。 – mostruash
你在使用Babel嗎?這是一個ES7功能。 – MinusFour
@MinusFour是的,我正在使用babel – arisalexis