2017-01-30 17 views
3

私は次のコードを持っています。非同期/約束を約束する

class DB { 
    constructor(client) { 
    this.client = client; 
    } 
} 

export default function store() { 
    return new Promise((resolve, reject) => { 
    pg.connect(process.env.DATABASE_URL, client => { 
     client.query('CREATE TABLE x(name VARCHAR(100))'); 
     return resolve(new DB(client)); 
    }); 
    }); 
} 

クラスのコンストラクタ内のストア機能を移動し、/待つ非同期を使用して、それを書き換えする方法はありますか?

+0

あなたはすでに何かをしようとしたことがありますか?あなたのコードを教えてください。私達は議論することから始めることができます... – Andrea

+4

私はそれが可能だとは思わない;コンストラクタは本質的に同期しているため、コンストラクタ内で非同期操作を行うことはできません(少なくとも適切ではない)。 – Frxstrem

+0

@Frxstremで同意します。通常、コンストラクタは新しいインスタンスを返すことになっています。クラスにストア関数を追加してコンストラクタ内でトリガすることもできます(インスタンスプロパティに約束を割り当てる)。 – nils

答えて

2

私の知る限り、あなたは、コンストラクタ非同期関数を宣言することはできません。ただし、コンストラクタからPromiseを返すことはできます。あなたはasync/await使用することができ、それに

function connect(url) { 
    return new Promise((resolve, reject) => { 
    pg.connect(url, resolve); 
    }); 
} 

This seems to be a terrible idea, so don't use this in a real-world context.

// Define the class 
class DB { 
    constructor() { 
    return this.store().then(client => { this.client = client; return this; }); 
    } 

    async store() { 
    const client = await new Promise((resolve) => { 
     pg.connect(process.env.DATABASE_URL, resolve); 
    }); 
    client.query('CREATE TABLE x(name VARCHAR(100))'); 
    return new DB(client); 
    } 
} 

// Create an async function environment 
(async function handleData() { 
    const db = await new DB(); 
    // Do something with your DB 
})(); 
+0

これは期待どおりに動作しません。コンストラクターは常にインスタンスを返します。コンストラクタの 'return'は無視されます。 –

+0

Jup、私はそれを疑った。結果は約束なしで同じになるだろう。代わりに、インスタンスプロパティでそれを試してください: 'クラスA { }コンストラクタ(){ this.name = 12; 戻り値Promise.resolve(this.name); } } (非同期()=> {constのaは=待つ新しいA();はconsole.log(A);})(); ' – nils

+0

私は完全に何が起こっているか誤解しない限り、これは期待通りに動作するようです。または私は完全に基盤から離れていますか? – nils

1

あなたは完全な接続をpromisifyingためにあなたがそれを必要とPromiseコンストラクタを避けることができない

export default async function store() { 
    const client = await connect(process.env.DATABASE_URL); 
    client.query('CREATE TABLE x(name VARCHAR(100))'); 
    return new DB(client); 
} 

あなたの場合その機能をあなたのクラスに移すことができますが、私は何の理由も見ません:

export default class DB { 
    constructor(client) { 
    this.client = client; 
    } 
    static async store() { 
    const client = await connect(process.env.DATABASE_URL); 
    client.query('CREATE TABLE x(name VARCHAR(100))'); 
    return new this(client); 
    } 
} 
関連する問題