[英]Return destructured object from IIFE in ES6 module
我無法弄清楚如何在最后做到這一點
export {inMemoryDb, backup };
所以我想基本上將 IIFE 的返回值導出為命名導出。
InMemoryDB.ts
const result = (async () => {
const inMemoryDb = newDb();
await inMemoryDb.public.migrate();
const backup = inMemoryDb.backup();
return { inMemoryDb, backup };
})();
export result;
// but I actually want to export it as { inMemoryDb, backup }
我認為應該是
const result = (() => {
const inMemoryDb = newDb();
inMemoryDb.public.migrate()
const backup = inMemoryDb.backup();
return { inMemoryDb, backup };
}()); //<-- note here.
然后
export const inMemoryDb = result.inMemoryDb;
export const backup = result.backup
所有出口必須是 static。 這允許在模塊分辨率中進行許多優化。 因此,即使您有 object,您也無法在未明確指定的情況下將其屬性導出為命名導出。
但是,您的代碼的主要問題是異步。 這就是阻止您按原樣導出這些內容並導致導入它的復雜性的原因。
解決方案選項:
如果您使用支持它的平台,使用Babel之類的工具編譯代碼,或者使用TypeScript 3.8或更高版本,那么您已經可以使用此功能。
它可以讓你丟棄 IIAFE,所以你可以簡單地寫:
export const inMemoryDb = newDb(); await inMemoryDb.public.migrate(); export const backup = inMemoryDb.backup();
最好的一點是,當您import
它時,您甚至不必await
它,它會自動完成。
這是此問題的解決方案,但對於那些還沒有訪問此功能的人,這里有一些解決方法:
導出 Promise中的所有內容
好吧,這並不能回答您的問題,因為它不使用命名導出。 順便說一句,這幾乎就是您的代碼所做的!
const result = (async () => { const inMemoryDb = newDb(); await inMemoryDb.public.migrate(); const backup = inMemoryDb.backup(); return { inMemoryDb, backup }; })(); export default result;
為此,您的進口商需要:
import result from './inMemoryDB.ts' (async () => { const { inMemoryDb, backup } = await result // Do stuff })()
在單獨的 Promise 中導出所有內容
const result = (async () => { const inMemoryDb = newDb(); await inMemoryDb.public.migrate(); const backup = inMemoryDb.backup(); return { inMemoryDb, backup }; })(); export const inMemoryDb = result.then(({inMemoryDb}) => inMemoryDb); export const backup = result.then(({backup}) => backup);
進口商代碼:
import { inMemoryDb, backup } from './inMemoryDB.ts' (async () => { const foo = await inMemoryDb const bar = await backup // Do stuff })()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.