72469


下記の非同期で書かれたコードをクラスのメソッドとして定義したいのですが、上手くいきません。どのようにコードを書いたら良いでしょうか？  
asyncを使用した関数はクラスメソッドに定義出来ないようなのでラップしたら上手く行くと思ったのですが `this.wait(num)`
推奨しない書き方と注意が入るのと、実行しても何も出力されません。予定では `0,1`が出力されます。  
詳しい方、助けて下さいお願いします。

[code]

    function wait(num){
        return new Promise((resolve, reject) => {
            setTimeout(() => {
                console.log(num);
                if(num === 2){
                    reject(num);
                }else{
                    resolve(num);
                }
            }, 100);
        });
    }
    
    
    async function init(){
        let num = 0
        try{
            num = await wait(num);
            num++;
            num = await wait(num);
            num++;
    
        }catch(e){
            throw new Error('Error is occured', e);
    
        }
        return num;//Promiseでラップされた値が返る。
    }
    
    init();//戻り値がPromiseなのでそのままthenメソッドが使用できる。
    
[/code]

**イメージとして下記のようにしたいが上手く動作しない。**

[code]

    class test {
        constructor(){
            this.init()
        }
        
        wait(num){
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log(num);
                    if(num === 2){
                        reject(num);
                    }else{
                        resolve(num);
                    }
                }, 100);
            });
        }
        
        init() {
            async function init(){
                let num = 0
                try{
                    num = await this.wait(num);
                    num++;
                    num = await this.wait(num);
                    num++;
            
                }catch(e){
                    throw new Error('Error is occured', e);
            
                }
                return num;//Promiseでラップされた値が返る。
            }
        }
    }
    
    new test()
    
[/code]


CC BY-SA 4.0
2020-12-07T03:28:30.847
72468
2020-12-07T03:55:55.597
22565
question
javascript 非同期
Javascriptで非同期関数をクラスメソッドに定義したい。


classのメソッド定義でもasync/awaitは利用可能です。ただし、constructorでのasync定義はsyntax
errorとなるため、初期化後に非同期関数を実行することになります。

[code]

    class test {
        async wait(num) {
            return new Promise((resolve, reject) => {
                setTimeout(() => {
                    console.log(num);
                    if (num === 2) {
                        reject(num);
                    }
                    else {
                        resolve(num);
                    }
                }, 100);
            });
        }
        async init() {
            let num = 0;
            try {
                num = await this.wait(num);
                num++;
                num = await this.wait(num);
                num++;
            }
            catch (e) {
                throw new Error(e); // Errorは引数を1つしか取りません
            }
            return num; //Promiseでラップされた値が返る。
        }
    }
    new test().init();
[/code]


CC BY-SA 4.0
2020-12-07T03:55:55.597
72469
2020-12-07T03:55:55.597
7997
72468
answer