迭代一个承诺结果,并对其他承诺进行多次调用

时间:2017-08-13 12:50:09

标签: angular angular-promise

我使用外部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);
      });
  }

getTasksListgetUsersName都会返回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);

但是,我不能适应我的情况。

1 个答案:

答案 0 :(得分:0)

您的代码中存在一些错误。

  • 您还没有从then返回任何内容,但您还是chaining .then calls
  • 您正在使用if/else结构记录错误,而不是使用Promise#catch机制。
  • 您正在返回for循环内部,这意味着您在第一次迭代时将其分解。

由于你正在使用Angular,你应该利用Observables。您可以使用mergeMap from RxJS

代替嵌套调用

如果您仍想使用promises,您可能会发现async/await更容易使用。它是浏览器中的新功能,但由于您使用的是转换程序,因此您不必担心浏览器支持它。