2017-08-04 21 views
2

forループ内でasync/awaitを使用するにはどうすればよいですか?async/for wait forループを使用する

これは私のコードです:

export default (req, callback) => { 
    // ... 
    compliance.forEach((rule, index) => { 
    let response = await waRuleOverview(req, run.id, rule.id); 
    // handle the response 
    }); 
} 

これは私がwaRuleOverview関数を定義する方法である:

export function waRuleOverview(req, runId, ruleId) { 
    var def = deferred(); 

    setTimeout(function() { 
    const apiToken = req.currentUser.apiToken; 
    const payload = { 
     'Authorization': 'api_key ' + apiToken 
    } 

    const options = { 
     'method': 'get', 
     'gzip': true, 
     'headers': payload, 
     'content-type': 'application/json', 
     'json': true, 
     'url': 'api-url' 
    } 

    request(options, (error, response, body) => { 
     def.resolve(body); 
    }); 
    }, 50); 

    return def.promise; 
} 

それはコンソールでこのエラーがスローされます。

のawaitが予約されています単語

この質問は、それを解決する方法を見つけようとしているthisに関連しています。

+0

私は試みましたが、私はまだそのエラーを受け取ります。 – Valip

+0

@アンドレアスなぜですか? OPは 'waRuleOverview'の中で' await'を使用しませんが、Promiseを返します –

答えて

10

これは、非同期コードの実行方法(逐次または並列)によって異なります。とにかく、awaitを使用するには、asyncというキーワードを追加する必要があります。

// sequential 
export default async (req, callback) => { 
    // ... 
    for(const [rule, index] of compliance.entries()) { 
    const response = await waRuleOverview(req, run.id, rule.id) 

    // handle the response 
    } 
} 

// parallel 
export default async (req, callback) => { 
    // ... 
    const responses = await Promise.all(compliance 
    .map((rule, index) => waRuleOverview(req, run.id, rule.id)) 
) 

    // handle responses 
    responses.forEach(response => { 
    // ... 
    // handle response here 
    }) 
} 

最後に、ハンドラがプロミスを返すのではなく、副作用のためにいくつかの非同期アクションを実行するようにしたい場合は、

export default (req, callback) => { 
    // ... 
    compliance.forEach(/* add */ async (rule, index) => { 
    // to use await inside 
    let response = await waRuleOverview(req, run.id, rule.id); 
    // handle the response 
    }); 
} 

しかし、このアプローチは、約束事のチェーンを破るので、実際には反パターンです。合成性、エラー処理などが悪いです。

関連する問題