Tôi có một cấu trúc giống như mảng hiển thị các phương thức không đồng bộ. Phương thức không đồng bộ gọi trả về các cấu trúc mảng mà lần lượt hiển thị nhiều phương thức không đồng bộ hơn. Tôi đang tạo một đối tượng JSON khác để lưu trữ các giá trị thu được từ cấu trúc này và vì vậy tôi cần phải cẩn thận về việc theo dõi các tham chiếu trong các lệnh gọi lại.
Tôi đã viết mã một giải pháp bạo lực, nhưng tôi muốn tìm hiểu một giải pháp thành ngữ hoặc rõ ràng hơn.
- Mẫu phải được lặp lại cho n cấp độ lồng nhau.
- Tôi cần sử dụng hứa hẹn.all hoặc một số kỹ thuật tương tự để xác định thời điểm giải quyết quy trình bao vây.
- Không phải mọi phần tử đều nhất thiết phải thực hiện một cuộc gọi không đồng bộ. Vì vậy, trong một promise.all lồng nhau, tôi không thể chỉ định các phần tử mảng JSON của mình dựa trên chỉ mục. Tuy nhiên, tôi cần phải sử dụng một cái gì đó như promise.all trong forEach lồng nhau để đảm bảo rằng tất cả các phép gán thuộc tính đã được thực hiện trước khi giải quyết quy trình bao vây.
- Tôi đang sử dụng bluebird Prom lib nhưng đây không phải là yêu cầu
Đây là một số mã một phần -
var jsonItems = [];
items.forEach(function(item){
var jsonItem = {};
jsonItem.name = item.name;
item.getThings().then(function(things){
// or Promise.all(allItemGetThingCalls, function(things){
things.forEach(function(thing, index){
jsonItems[index].thingName = thing.name;
if(thing.type === 'file'){
thing.getFile().then(function(file){ //or promise.all?
jsonItems[index].filesize = file.getSize();
Promise.map
(đồng thời) và Promise.each
(tuần tự) trong trường hợp này, cũng lưu ý Promise.defer
không được dùng nữa - mã trong câu trả lời của tôi cho thấy cách tránh điều đó bằng cách trả lại các lời hứa. Lời hứa là tất cả về giá trị trả về.