簡體   English   中英

從 ES6 模塊中的 IIFE 返回解構的 object

[英]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,您也無法在未明確指定的情況下將其屬性導出為命名導出。


但是,您的代碼的主要問題是異步。 這就是阻止您按原樣導出這些內容並導致導入它的復雜性的原因。

解決方案選項:

  1. 頂層await提案(第 3 階段)

    如果您使用支持它的平台,使用Babel之類的工具編譯代碼,或者使用TypeScript 3.8或更高版本,那么您已經可以使用此功能。

    它可以讓你丟棄 IIAFE,所以你可以簡單地寫:

     export const inMemoryDb = newDb(); await inMemoryDb.public.migrate(); export const backup = inMemoryDb.backup();

    最好的一點是,當您import它時,您甚至不必await它,它會自動完成。

    這是此問題解決方案,但對於那些還沒有訪問此功能的人,這里有一些解決方法:

  2. 導出 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 })()
  3. 在單獨的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM