2016-04-01 23 views
8

Come indicato nella domanda. Sarò permesso di fare questo:Async/Wait ci consentirà di essere utilizzati sui costruttori?

class MyClass { 
    async constructor(){ 
     return new Promise() 
    } 
} 
+1

async/await non fa parte di ES7. –

+0

Anche se sarebbe possibile (suggerimento: non lo è), [sarebbe una pratica orribile] (http://stackoverflow.com/q/243986/1048572) – Bergi

+0

Una possibile soluzione sarebbe quella di aggiungere un 'async statico' funzione che esegue l'inizializzazione asincrona prima di costruire effettivamente l'istanza di 'MyClass'. –

risposta

10

Senza cercare di fortuna-raccontano le decisioni future, concentriamoci sulla praticità e ciò che è già noto.

ES7, come ES6 prima che proverà ad essere un'espansione compatibile con le versioni precedenti della lingua. Con questo in mente, una funzione di costruzione compatibile con le versioni precedenti è essenzialmente una funzione regolare (con alcune restrizioni di runtime) che deve essere invocata con la parola chiave new. Quando ciò accade, il valore di ritorno della funzione ottiene un trattamento speciale, in particolare i valori di ritorno non oggetto vengono ignorati e l'oggetto appena assegnato viene restituito mentre i valori di ritorno dell'oggetto vengono restituiti così come sono (e l'oggetto appena assegnato viene gettato via). Con questo, il tuo codice si tradurrebbe in una promessa di essere restituito e nessuna "costruzione di oggetti" avrebbe luogo. Non vedo la praticità di questo e suppongo che se qualcuno si prende il tempo per trovare cosa fare con tale codice verrà rifiutato.

+0

Ha senso. Non è chiaro nella proposta. Mi stavo chiedendo perché puoi ancora utilizzare un valore di ritorno nel costruttore in modo da non ricevere la tua istanza. – wintercounter

+0

Non ho davvero avuto la possibilità di passare attraverso la proposta quindi la mia risposta ipotetica, ma sono abbastanza fiducioso che questo sarà definito come errore di codice statico. – Amit

+0

Se dovessero aggiungerlo, penso che dovrebbero anche aggiungere un modo per definire una classe asincrona in modo che tu sappia attendere la funzione di costruzione (che suona appiccicosa) per aggirare il problema che presenta Amit. –

9

In poche parole:

  1. costruttore è una funzione che deve fornire un oggetto concreto.
  2. Async restituisce una promessa; esattamente l'opposto della concretezza.
  3. async constructor è concettualmente in conflitto.
7

Per espandere su ciò che ha detto Patrick Roberts, non si può fare quello che chiedete, ma si può fare qualcosa di simile a questo, invece:

class MyClass { 
    constructor() { 
    //static initialization 
    } 

    async initialize() { 
    await WhatEverYouWant(); 
    } 

    static async create() { 
    const o = new MyClass(); 
    await o.initialize(); 
    return o; 
    } 
} 

Poi nel codice creare l'oggetto in questo modo:

const obj = await MyClass.create(); 
1

È possibile ottenere una promessa dal valore di ritorno, e attendono su questo:

class User { 
 
    constructor() { 
 
    this.promise = this._init() 
 
    } 
 
    
 
    async _init() { 
 
    const response = await fetch('https://jsonplaceholder.typicode.com/users') 
 
    const users = await response.json() 
 
    this.user = users[Math.floor(Math.random() * users.length)] 
 
    } 
 
} 
 

 
const u = new User() 
 
u.promise.then(() => { 
 
    $('#result').text(JSON.stringify(u.user, null, 2)) 
 
}).catch(err => { 
 
    console.error(err) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<pre id="result"><code></code></pre>

Problemi correlati