web-dev-qa-db-ja.com

nodejsの非同期/待機のサポート?

私が修正できない小さな問題。 Node v8.1.1を使用していて、async/awaitを使用しようとしましたが、機能しません。コードスニペットは次のようになります。

const axios = require('axios');

const TOKEN = '...';

const httpClient = axios.create({
    baseURL : 'https://myhost/api/',
    headers : {
        'Authorization': `Token ${TOKEN}`
    }
});

try {
    const resp = await httpClient.get('users?limit=200');
} catch(e) {
    console.error(`Fail !\n${e}`);
}

そして、それを実行しようとすると、このエラーメッセージが表示され、何も起こりません:

/Users/mathieu/workspaces/galactic-tools/index.js:13
    const resp = await httpClient.get('users?limit=200');
                       ^^^^^^^^^^

SyntaxError: Unexpected identifier
    at createScript (vm.js:74:10)
    at Object.runInThisContext (vm.js:116:10)
    at Module._compile (module.js:533:28)
    at Object.Module._extensions..js (module.js:580:10)
    at Module.load (module.js:503:32)
    at tryModuleLoad (module.js:466:12)
    at Function.Module._load (module.js:458:3)
    at Function.Module.runMain (module.js:605:10)
    at startup (bootstrap_node.js:158:16)
    at bootstrap_node.js:575:3

非同期/待機はNodeバージョン8では直接サポートされているはずですよね?疑わしいことに、私はnode --harmony-async-await index.jsnode --harmony index.jsで実行しようとしましたが結果はありませんでした。

8
mbreton

Node8でasync/awaitがサポートされているかどうかはわかりませんが、try/catchを次のような関数でラップしてみることができます。

async function callService() {
    try {
        const resp = await httpClient.get('users?limit=200');
    } catch(e) {
        console.error(`Fail !\n${e}`);
    }
}
callService()

どのブロックが非同期動作をするかが明確である必要があるためです。また、これが機能するためには、httpClient.get()がPromiseを返す必要があります。そうであることを確認してください。

5
John Smith

async/awaitはノードv8.xでサポートされています。ただし、awaitはasync関数内にある必要があります。彼らは常にペアで来ます。

6
Comtaler