2013-11-23 1 views
5

У меня есть следующий код:Как получить результат от предыдущего обещания в цепочке обещаний AngularJS?

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

Вы можете поместить затем в сферу, где пользователь по-прежнему доступны (проверить закрытие)

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

От Kriskowal-х Q documentation сам, оба стиля эквивалентны. Угловое-х $q основана на Q

Единственным отличием является вложенности. Полезно укладывать обработчики, если вам нужно захватить несколько входных значений в вашем закрытии.

+0

Спасибо, но это третий случай я говорил в моем вопросе - вложенность они :) Я пытаюсь избежать этого, потому что я просто показал упрощенное дело - в реальном коде есть еще несколько обещаний, поэтому вложение их было бы подобно использованию обратных вызовов. – szimek

+0

Хм ... да, ты прав. Дело в том, что я использую этот вложенный стиль в своем коде, а код действительно очень большой ... Уровень вложенности на самом деле не такой большой. Кроме того, синтаксис Coffeescript очень помогает;) –

+0

Я также использую CoffeeScript, поэтому я попытаюсь вложить их в папку и посмотреть, как это выглядит. Хотя я не совсем уверен, как работает обработка ошибок в случае вложенных обещаний ... – szimek

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

+0

Спасибо! Это то, что я делаю во втором примере, хотя только после его публикации я обнаружил, что могу передать только один аргумент 'defer.resolve', поэтому мой пример с' defer.resolve (user, tasks) ' немного неверно. Это кажется самым чистым решением для меня, хотя требует создания нового объекта отложенного вручную, что может сильно сосать, если вам нужно, например. передать переменную через всю цепочку. – szimek

+0

может хранить различные шаги в объекте службы, просто вернуть этот объект в конец – charlietfl

+0

Я не знаком с Q/Angular обещаниями, но если 'Task' происходит асинхронно, это гарантирует, что' defer' будет содержать как 'user' и 'tasks' данные к тому моменту, когда происходит второе тело' then'? Если я правильно понимаю, 'defer.resolve()' мутирует состояние объекта 'defer', так как возвращает' defer.promise', знает ли, что тело 'Task.all' завершено? Я пытаюсь понять, как это решение работает. –

 Смежные вопросы

  • Нет связанных вопросов^_^