2013-11-23 26 views
5

Tôi có đoạn mã sau:Cách truy cập kết quả từ lời hứa trước đó trong chuỗi lời hứa AngularJS?

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

Có một số cách built-in để vượt qua user đối tượng thứ hai then chức năng mà không làm một cái gì đó như thế này:

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

hay này:

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 
}) 

hoặc lồng chúng bằng cách gọi số then thứ hai trực tiếp trên Task.all (cách này tôi có đối tượng user có sẵn thông qua đóng cửa)? Làm tổ họ là chính xác những gì tôi đang cố gắng để tránh.

Trả lời

2

Bạn có thể đặt sau đó trong phạm vi nơi người dùng vẫn có thể truy cập (kiểm tra đóng cửa)

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

Từ Kriskowal của Q documentation bản thân, cả hai phong cách là tương đương. Angular's $q được dựa trên Q

Sự khác biệt duy nhất là lồng ghép. Sẽ rất hữu ích khi lồng ghép các trình xử lý nếu bạn cần chụp nhiều giá trị đầu vào trong quá trình đóng.

+0

Cảm ơn, nhưng đó là trường hợp thứ ba tôi đã nói về trong câu hỏi của tôi - làm tổ họ :) Tôi đang cố gắng tránh nó, bởi vì tôi chỉ cho thấy một trường hợp đơn giản - trong mã thực có một vài hứa hẹn hơn, do đó, lồng chúng sẽ giống như sử dụng callbacks. – szimek

+0

hmm ... vâng, bạn nói đúng. Vấn đề là tôi đang sử dụng kiểu lồng nhau này trong mã của tôi, và mã thực sự rất lớn ... Mức độ làm tổ không thực sự quá lớn. Ngoài ra, cú pháp Coffeescript giúp rất nhiều;) –

+0

Tôi đang sử dụng CoffeeScript, vì vậy tôi sẽ cố gắng lồng ghép chúng và xem nó trông như thế nào. Mặc dù tôi không chắc chắn chính xác cách xử lý lỗi hoạt động trong trường hợp các lời hứa lồng nhau ... – szimek

1

thể kết hợp sử dụng, nhiệm vụ thành một đối tượng để vượt qua để tiếp 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

Cảm ơn! Đó là những gì tôi đang làm trong ví dụ thứ hai, mặc dù chỉ sau khi đăng nó, tôi phát hiện ra rằng tôi có thể vượt qua chỉ một đối số duy nhất để 'defer.resolve', vì vậy ví dụ của tôi với' defer.resolve (user, tasks) 'là hơi sai. Nó có vẻ là giải pháp sạch nhất cho tôi, mặc dù yêu cầu tạo đối tượng trì hoãn mới theo cách thủ công, điều này có thể hút rất nhiều nếu bạn cần, ví dụ: để vượt qua một biến thông qua toàn bộ chuỗi. – szimek

+0

có thể lưu trữ các bước khác nhau trong đối tượng dịch vụ, chỉ trả lại đối tượng đó ở cuối – charlietfl

+0

Tôi không quen với lời hứa Q/Angular, nhưng nếu 'Task' xảy ra không đồng bộ, điều này đảm bảo rằng' defer' sẽ chứa cả 'user' và dữ liệu 'tác vụ' vào thời điểm cơ thể' then' thứ hai xảy ra? Nếu tôi hiểu chính xác, 'defer.resolve()' đang làm biến đổi trạng thái của đối tượng 'defer', vậy làm thế nào để trả về' defer.promise' biết liệu 'Task.all' có bị kết thúc không? Tôi đang cố gắng hiểu cách giải pháp này hoạt động. –

Các vấn đề liên quan