2015-02-22 18 views
5

Tôi mới thành lời hứa và sử dụng triển khai rsvp.Cách đọc nhiều tệp không đồng bộ với lời hứa, sau đó tiến hành

Tôi muốn đọc một danh sách các tệp không đồng bộ, sau đó chuyển sang tác vụ khác chỉ khi tất cả các tệp đã được đọc.

Tôi đã có như xa như cấu trúc cơ bản để đọc một tập tin, và chuỗi nhiệm vụ tiếp theo:

var loadFile = function (path) { 
    return new rsvp.Promise(function (resolve, reject) { 
     fs.readFile (path, 'utf8', function (error, data) { 
      if (error) { 
       reject(error); 
      } 
      resolve(data); 
     }); 
    }); 
}; 

loadFile('src/index.txt').then(function (data) { 
    console.log(data); 
    return nextTask(data); 
}).then(function (output) { 
    //do something with output 
}).catch(function (error) { 
    console.log(error); 
}); 

tôi muốn làm một cái gì đó như thế này:

loadFile(['src/index.txt', 'src/extra.txt', 'src/another.txt']).then(... 

tôi đã nhìn thấy arrays of promiseshash of promises trong tài liệu, nhưng tôi không biết cái nào phù hợp nhất hoặc cách sử dụng chúng. Tôi cần một ví dụ về việc sử dụng chúng trong bối cảnh vấn đề của tôi ở trên để hiểu chúng.

Trả lời

5

Bạn muốn sử dụng RSVP.all():

var promises = ['path1', 'path2', 'path3'].map(loadFile); 

RSVP.all(promises).then(function(files) { 
    // proceed - files is array of your files in the order specified above. 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

Hãy thoải mái để làm promises một đối tượng và sử dụng RSVP.hash() thay vì:

var promises = { 
    file1: loadFile('path1'), 
    file2: loadFile('path2'), 
    file3: loadFile('path3') 
}; 

RSVP.hash(promises).then(function(files) { 
    // files is an object with files under corresponding keys: 
    // ('file1', 'file2', 'file3') 
}).catch(function(reason) { 
    console.log(reason); // something went wrong... 
}); 

(nhờ @Benjamin Gruenbaum gợi ý để sử dụng .map())

+0

Trước khi tải các tập tin, tôi có một nhiệm vụ trước đó không liên quan trả về một lời hứa khác. Làm thế nào để tôi chuỗi RSVP.all() để chờ nhiệm vụ phụ thuộc này? – mtmacdonald

+1

Chỉ cần gọi hàm RSVP.all() trong phần gọi lại giải quyết của tác vụ trước đó của bạn. – bardzusny

+0

Tôi không thể làm phiên bản đối tượng hoạt động: [Lỗi: Phương thức mảng phải được cung cấp một Mảng]. Đừng bận tâm - đó là những gì RSVP.hash dành cho. – mtmacdonald

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