2016-02-22 20 views
5

Vì vậy, tôi đang cố gắng để chuyển mã của tôi vào "Promise thế giới", và ở nhiều nơi khi tôi đã phải "vòng lặp" với chức năng async - tôi chỉ đơn giản sử dụng đệ quy theo cách như vậyAsync đệ quy sử dụng lời hứa

function doRecursion(idx,callback){ 
    if(idx < someArray.length){ 
     doAsync(function(){ 
      doRecursion(++idx,callback) 
     }); 
    }else{ 
     callback('done!') 
    } 
} 
doRecursion(0,function(msg){ 
    //... 
}); 

Bây giờ tôi đang cố gắng để thực hiện thay đổi vào thế giới Promise, và tôi khá mắc kẹt

var Promise = require('bluebird') 
function doRecursion(idx){ 
    return new Promise(function(resolve){ 
     if(idx < someArray.length){ 
      doAsync(function(){ 
       //... doRecursion(++idx) 
       // how do i call doRecusion here.... 
      }); 
     }else{ 
      resolve('done!') 
     } 
    }); 
} 
doRecursion(0).then(function(msg){ 
    //... 
}); 

Cảm ơn.

+2

'quyết tâm (doRecursion (++ idx)); '- nếu bạn giải quyết Promise 1 với Promise 2, sau đó hứa sẽ giải quyết 1 với giá trị giải quyết của Promise 2 –

+0

hãy ngừng sử dụng [lời hứa constructor chống mẫu] (http://stackoverflow.com/q/23803743/918910). Điều này cũng cho câu trả lời. – jib

Trả lời

4

Tôi muốn sử dụng phương thức Promise.all.

Điều này làm là chờ cho đến khi tất cả các lời hứa trong mảng đã được giải quyết. Bản đồ sẽ áp dụng phương thức async cho mỗi mục trong mảng và trả về một lời hứa.

function doAsyncP() { 
    return new Promise((resolve) => { 
     doAsync(function() { 
      resolve(); 
     }); 
    }); 
} 

Promise.all(
    someArray.map(doAsyncP) 
).then((msg) => { 
    //we're done. 
}); 
1

Trong hàm đệ quy, bạn có thể làm điều này:

... 
if (idx < someArray.length) { 
    doAsync(function() { 
    resolve(doRecursion(idx + 1)); 
    }); 
} else { 
... 

Nói cách khác, trong khi idx là ít hơn someArray.length, lời hứa sẽ giải quyết lời hứa khác, lần này hứa hẹn trở lại bằng cách gọi doRecursion() với một idx được tăng thêm một. Gọi lại then phía dưới sẽ không được gọi cho đến khi doRecursion giải quyết một số giá trị khác với lời hứa. Trong trường hợp này, cuối cùng nó sẽ giải quyết với giá trị là 'done!'.

Điều đó nói rằng, nếu bạn đang sử dụng lời hứa, bạn có thể không cần phải sử dụng đệ quy nào cả. Bạn có thể phải refactor mã của bạn nhiều hơn một chút, nhưng tôi sẽ đề nghị xem xét câu trả lời của @ BenFortune như là một thay thế.

+0

Bit của IMO chống mẫu nếu bạn đang sử dụng lời hứa. –

+0

@BenFortune Vâng, tôi đồng ý, nhưng đó là những gì người hỏi hỏi. Tôi chưa bao giờ nghĩ đến việc sử dụng đệ quy với lời hứa trước đây, và đó có lẽ là lý do tại sao. Người hỏi nên xem xét việc chấp nhận câu trả lời của bạn thay thế. – McMath

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