如何访问AngularJS保证链中先前承诺的结果?

时间:2013-11-23 18:14:53

标签: javascript angularjs promise

我有以下代码:

authService.authenticate()
.then(function (user) {
  return Task.all({user: user})
})
.then(function (tasks) {
  // How to access user object here?
})

是否有一些内置方法可以将user对象传递给第二个then函数而不执行以下操作:

var user2 = null;
authService.authenticate()
.then(function (user) {
  user2 = user
  return Task.all({user: user})
})
.then(function (tasks) {
   // Use user2 here
})

或者这个:

authService.authenticate()
.then(function (user) {
  var defer = $q.defer()
  Task.all({user: user}).then(function (tasks) {
    return defer.resolve(user, tasks)
  })
  return defer.promise
})
.then(function (user, tasks) {
   // Use user2 here
})

或通过直接在then上调用第二个Task.all来嵌套它们(这样我可以通过关闭获得user个对象)? 嵌套它们正是我想要避免的。

2 个答案:

答案 0 :(得分:2)

您可以将then置于仍可访问用户的范围内(检查闭包)

authService.authenticate()
.then(function (user) {
  Task.all({user: user})
  .then(function (tasks) {
    // How to access user object here?
  })
})

从Kriskowal的Q documentation本身来看,两种风格都是等价的。 Angular的$q基于Q

  

唯一的区别是嵌套。如果需要在闭包中捕获多个输入值,则嵌套处理程序非常有用。

答案 1 :(得分:1)

可以将用户和任务合并到一个对象中以传递到下一个then

authService.authenticate()
.then(function (user) {
  var defer = $q.defer()
  Task.all({user: user}).then(function (tasks) {

    return defer.resolve({user:user, tasks:tasks})
  })
  return defer.promise
})
.then(function (data) {
   $scope.user=data.user;
   $scope.tasks=data.tasks;
})

DEMO