2017-08-04 52 views
2

如何在for循環中使用async/await?在循環中使用async/await

這是我的代碼:

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; 
} 

它拋出在控制檯此錯誤:

等待是一個保留word

這個問題與this有關,我試圖弄清楚如何解決它。

+0

我試過了,但是我仍然得到那個錯誤.. – Valip

+0

@Andreas爲什麼? OP不在'waRuleOverview'內使用'await',但返回一個Promise –

回答

10

這取決於您希望如何執行異步代碼:按順序還是並行執行。無論如何,您需要添加async關鍵字才能使用await

// 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 
    }) 
} 

最後,如果你不想讓你的處理程序返回一個Promise,但只是希望它執行一些副作用的異步操作。

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 
    }); 
} 

但這種方法實際上是一個反模式,因爲它打破了承諾鏈:壞的組合性,錯誤處理和這樣的。