2014-07-23 16 views
7

Tôi muốn chuỗi một số lời hứa được trả về bởi các dịch vụ. Điều này hoạt động, miễn là một số phương thức trả về lời hứa, không yêu cầu tham số bổ sung. Đây là ví dụ của tôi:AngularJS: Vượt qua các tham số bổ sung cho các lời hứa bị xích

var first = function() { 
    var d = $q.defer(); 
    $timeout(function() { 
    d.resolve("first resolved") 
    }, 100) 
    return d.promise; 
}; 

var second = function(val) { 
    console.log("value of val: ", val); 
    var d = $q.defer(); 
    $timeout(function() { 
    d.resolve("second resolved") 
    }, 200) 
    return d.promise; 
}; 

first().then(second).then(function(value) { 
    console.log("all resolved", value); 
}); 

Điều này hoạt động như mong đợi. Nhưng nếu dịch vụ của tôi second cần thêm thông số val để thực hiện công việc đó là gì? Với phương pháp trên giá trị của val"first resolved", bởi vì giá trị được giải quyết từ first.

Có cách nào để khắc phục, mà không làm tổ chức năng vô danh như thế này:

first().then(function() { 
    return second("foobar").then(function(value) { 
    console.log("all resolved", value); 
    }); 
}); 

Tôi đã suy nghĩ về việc sử dụng $q.all, nhưng IMHO bạn không thể chỉ định một trật tự cho lời hứa của mình.

+0

'$ timeout' đã trả về một lời hứa, không cần một' $ q.defer'there –

+0

tôi biết, đó chỉ là cho mục đích trình diễn. Trong trường hợp thực sự của tôi, tôi có một cuộc gọi http và sau đó, thực hiện một số xử lý với dữ liệu. Vì vậy, tôi cần thêm '$ q.defer' – 23tux

+0

uhh ... $ http cũng trả về lời hứa và bạn có thể' .then' nó để xử lý thêm và trả lại ... không thể đưa ra phán đoán về mã Tôi đã không nhìn thấy nhưng nó vẫn còn _sounds_ như mô hình chống trì hoãn. Bạn _only_ cần '$ q.defer' khi làm việc chống lại một API gọi lại khi quảng bá nó. –

Trả lời

10

Tất nhiên. Cách thứ nhất:

first() 
    .then(function() { 
    return second("foobar"); 
    }) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 

Thứ hai (dễ dàng hơn nhiều) cách:

first() 
    .then(second.bind(null, "foobar")) 
    .then(function(value) { 
    console.log("all resolved", value); 
    }); 
+0

hoạt động giống như một sự quyến rũ! cảm ơn! – 23tux

+0

Bạn được chào đón. Điều quan trọng là bạn phải luôn luôn nhớ chức năng có thể được gọi chỉ bằng lời hứa. Vì vậy, nếu bạn cần tham số bổ sung hoặc bạn cần phải làm một cái gì đó với một giá trị nhất định, bạn phải quấn nó hoặc ràng buộc nó và vượt qua một chức năng đơn giản để gọi 'sau đó'. Và sau đó hàm có thể trả về một lời hứa khác. – Razem

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