【发布时间】:2018-02-23 12:43:01
【问题描述】:
我正在尝试通过等待/异步按顺序/同步顺序执行以下逻辑。
async loadData() {
console.log("STEP 1");
let ratesResponse = await getRates();
let accounts = realm.objects("Account");
accounts.map(async account => {
let accountResponse = await getAccountBalance(account.accountid);
console.log("STEP 2");
realm.write(() => {
account.cad_balance = accountResponse.balances[0].value;
account.usd_balance = (
parseFloat(accountResponse.balances[0].value) *
parseFloat(ratesResponse.last)
).toString();
});
});
console.log("STEP 3");
this.setState({
data: realm.objects("Account"),
last: ratesResponse.last,
high: ratesResponse.high,
low: ratesResponse.low,
refreshing: false
});
}
但是,应用功能不起作用,并且日志确认第 3 步发生在第 2 步之前:
2018-02-22 22:53:10.922 [info][tid:com.facebook.react.JavaScript] STEP 1
2018-02-22 22:53:10.921822-0500[13978:3180532] STEP 1
2018-02-22 22:53:11.211 [info][tid:com.facebook.react.JavaScript] STEP 3
2018-02-22 22:53:11.210787-0500[13978:3180532] STEP 3
2018-02-22 22:53:11.233 [info][tid:com.facebook.react.JavaScript] STEP 2
2018-02-22 22:53:11.233529-0500[13978:3180532] STEP 2
我错过了什么?
【问题讨论】:
-
它按您指定的方式工作。 .map() 中的异步回调返回一个承诺。您必须使用
.then()到console.log('Step 3'); -
Arman Charan 所说的也很有效。可能更接近您的设计目标。我看不见上面的
async()waaaay。 :-) -
真的吗? accounts.map 返回一个可以等待的 Promise?
-
你需要
await(Promise.all(accounts.map( ....- 而且,accounts.map函数实际上需要返回一些东西!! ...最好是承诺等待!! -
@JaromandaX 从技术上讲,如果
map()中最后一个await之后的所有内容都是同步的(我认为这里不是这种情况,但仍然如此),那么它实际上不需要返回自函数为async以来的任何内容。
标签: javascript react-native async-await