【发布时间】:2016-12-09 21:07:47
【问题描述】:
首先,我有一个users的数组,里面包含一些基本数据,比如
{"id": "1", "name": "a" }, {"id": "2", "name": "b" }
现在通过调用远程 API:self.getDrinks 对每个 user.id,它返回一个新数组 drinks[]。然后我想将drinks整合到每个用户中,最后应该是:
{"id": "1", "name": "a", "drinks": [{"id": "1-1", "name": "coke"}, {"id": "1-2", "name": "orange"}]}, {"id": "2", "name": "b", "drinks": [{"id": "2-1", "name": "coke"}, {"id": "2-2", "name": "lime"}] }
我使用了 noSQL,所以我必须执行异步函数来解析返回数据:
Result {
result (object, optional),
message (string, optional),
error (integer, optional)
}
这是我的功能:
var self = this;
var itemsProcessed = 0;
this.users.forEach(function (user, idx, arr) {
//assume the API getDrinks needs more parameters like below
self.getDrinks(user.id, "getDrink", 0, 100, '', '', '', '', '')
.then((data: Result) => {
itemsProcessed++;
arr[idx].drinks = data.result.drinks;
}
if (itemsProcessed === arr.length) {
Logger.debug("Expected Result: " + JSON.stringify(arr));
}
})
.catch(reason => Logger.error(reason));
});
Logger.debug("UnExpected Result: " + JSON.stringify(this.users));
如你所见,最后我无法得到正确的this.users,因为它是在forEach下的then函数中修改的。
有人建议我使用Promise.all(),但由于返回类型是数组drinks[],它总是报语法错误
【问题讨论】:
-
用户将被更改,只是在您登录时不会更改
-
@JaromandaX 它只打印相同的原始
users而没有drinks[]。并且第 2 个 Logger 将在第 1 个 Logger 之前执行,因此用户最终不会有饮料[]。 -
我的意思是用户被修改了,只是在您登录
this.users时没有-您声明他们不会更改-这是不正确的 -
谢谢@JaromandaX,我修改了我的问题。
标签: javascript asynchronous typescript foreach callback