我使用外部API,我无权访问其来源。其中一个端点返回类似的东西:
[{
task: '1',
task_name: 'Do the laundries',
project: '15',
project_name: 'My schedule',
user_id: '10'
},
....
]
然后对于上面的每个对象,我需要调用另一个端点来从user_id获取用户名并将其附加到上面的对象。最终结果应该是这样的:
[{
task: '1',
task_name: 'Do the laundries',
project: '15',
project_name: 'My schedule',
user_id: '10',
username: 'John Doe'
},
....
]
这是我到目前为止所做的事情,
getTasks() {
return this.myApi.getTasksList(this.maxResults)
.then( (data) => {
if ( data.status == 200 ) {
this.tasks = data.response.entries;
} else {
console.log('Something was wrong. Error status ' + data.status);
}
})
.then( (data) => {
for ( let task of this.tasks ) {
return this.myApi.getUsersName(task['user_id'])
.then( result => {
if ( result['status'] == 200 ) {
task['username'] = result.response.username;
} else {
console.log('Something was wrong. Error status ' + result['status']);
}
})
}
})
.catch(function (err) {
console.log('something was wrong: ' + err);
});
}
getTasksList
和getUsersName
都会返回Promise
。
有了上述内容,我会收到this.tasks
个数据,但不会包含username
。
我发现一个类似的问题说你需要创建一个Promises数组并立即调用它们。示例:
var promises = [];
for(var i = 0; i < 5; i++) {
var promise = $http.get('/data' + i);
promises.push(promise);
}
$q.all(promises).then(doSomethingAfterAllRequests);
但是,我不能适应我的情况。
答案 0 :(得分:0)
您的代码中存在一些错误。
then
返回任何内容,但您还是chaining .then
calls。if/else
结构记录错误,而不是使用Promise#catch
机制。for
循环内部,这意味着您在第一次迭代时将其分解。由于你正在使用Angular,你应该利用Observables。您可以使用mergeMap
from RxJS。
如果您仍想使用promises,您可能会发现async/await
更容易使用。它是浏览器中的新功能,但由于您使用的是转换程序,因此您不必担心浏览器支持它。