2016-11-04 7 views
2

私はJavaScriptを初めて使っていて、積極的に学習しています。私はのawaitキーワードを使用して、ES2016クラスの非同期メソッド内から約束を返すメソッドを呼び出しています:awaitキーワードを使用してもpromiseを返すメソッドが完全に実行されていませんか?

 export default class MyClass extends Model { 
      async getReport() { 
       const value = await xlsx.save(await this._getReportFileName()); 
       console.log('await keyword returned method value'); 
       console.log(`The value is: ${value}`); 
       return true; 
      } 
     } 

メソッドが実行なぜそれがそのロジックを実行する機会を得る前に、誰もが理由を見つけることができ、 resolveが呼び出される前にawaitキーワードは、実際に返される約束を待っているようではなく、コンソールに出力される値は未定義です。

オブジェクトのxlsxは、メソッドが保存持つクラスファイルのインスタンスである:

function save(xlsx, filename, options) { 
    return new Promise((resolve, reject) => { 
     try { 
      const stream = fs.createWriteStream(filename, options); 
      const zip = archiver('zip'); 

      stream.on('close',() => { 
       console.log('Resolving promise'); 
       resolve(); 
      }); 

      stream.on('error', (err) => { 
       console.log('Rejecting promise'); 
       reject(err); 
      }); 

      zip.pipe(stream); 

      const file1 = 'fixtures/file1.txt'; 
      const file2 = 'fixtures/file2.txt'; 

      zip 
       .append(fs.createReadStream(file1), { 
        name: 'file1.txt' 
       }) 
       .append(fs.createReadStream(file2), { 
        name: 'file2.txt' 
       }) 
       .finalize(); 
     } catch (error) { 
      console.log('Error when saving'); 
      reject(error); 
     } 
    }); 
} 

)それは(その解決が考えられます。ここでは

export default class File { 
    save(filename, options) { 
     writer.save(this, filename, options); 
    } 
} 

が呼び出されるヘルパーメソッドの保存のためのコードがありますストリームイベントのリスニングの範囲でアクセス可能でも利用可能でもありませんか?もしそうなら、ストリームイベントを聞いている間、どのように適切に約束を解決することができますか?

+0

はあなたが**キーワードを待つ**とそれを呼び出す方法を示しすることはできますか? – Molda

+0

あなたは矢印の関数に=と>の間に空白を入れているわけではありませんか?空白を持つ矢印関数を宣言しようとすると、エラーが発生する – soywod

+0

@Molda、ここでメソッドを呼び出す方法は次のとおりです。 await xlsx.save(await this._getReportFileName()); がtrueを返します。 –

答えて

1

save(filename, options)パススルーメソッドは非同期ではなく、save(xlsx, filename, options)メソッドから約束を返していません。

このお試しください:

export default class File { 
    async save(filename, options) { 
     await writer.save(this, filename, options); 
    } 
} 

またはこの:

export default class File { 
    save(filename, options) { 
     return writer.save(this, filename, options); 
    } 
} 
+0

最初の変数は 'value'変数を取得するために働かないので、' return'が必要です。 1人は 'return await'を使うことができますが、それは無意味です。 – Bergi

+0

@Bergi: 'writer.save()'メソッドのPromiseは決して値で解決されないので、効果は同じです(つまり 'undefined')。しかし、あなたは正しい: 'zip.finalize()'が完了した後に値を解決するように変更された場合は、 'return await'する必要があります。 – StriplingWarrior

関連する問題