2017-01-30 5 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)); 
    }); 
    }); 
} 

저장소 기능을 클래스 생성자 내부로 옮기고 async/await을 사용하여 다시 작성하는 방법이 있습니까?

+0

이미 시도 했습니까? 코드를 보여주십시오. 우리는 그것에 대해 토론 할 수 있습니다. – Andrea

+4

나는 그것이 가능하다고 생각하지 않습니다; 생성자는 본질적으로 동기식이므로 생성자 내부에서 비동기 작업을 수행 할 수 없습니다 (적어도 적절하지는 않음). – Frxstrem

+0

@Frxstrem에 동의하십시오. 일반적으로 생성자는 새 인스턴스를 반환해야합니다. 클래스에 저장소 함수를 추가하고 생성자 내에서 저장소 함수를 트리거 할 수 있습니다 (인스턴스 속성에 약속 지정). – nils

답변

2

AFAIK AFAIK 생성자를 비동기 함수로 선언 할 수 없습니다. 그러나 생성자로부터 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, 나는 잠시 그것을 의심했다. (결과가 약속 없이는 같을 것이다.) 대신 인스턴스 속성으로 시도해보십시오 :'class A { } constructor() { this.name = 12; return Promise.resolve (this.name); } } (async() = new {(); 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); 
    } 
}