2016-02-22 3 views
5

Так что я пытаюсь передать свой код в «Promise мир», и во многих местах, когда я должен был «петля» с функциональностью асинхронном - я просто использовал рекурсию таким образомАсинхронные рекурсивный с помощью обещания

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

Теперь я пытаюсь внести изменения в мир Promise, и я совсем застрял

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){ 
    //... 
}); 

Спасибо.

+2

'решительность (doRecursion (++ IDX));' - если разрешить Promise 1 с Promise 2, то Обещай 1 рассосется с разрешенным значением Promise 2 –

+0

Пожалуйста, прекратите использование [обещание конструктора анти- шаблон] (http://stackoverflow.com/q/23803743/918910). Это также касается ответов. – jib

ответ

4

Я бы выбрал подход Promise.all.

Это означает, что все обещания в массиве будут решены. Карта применит метод async к каждому элементу массива и вернет обещание.

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

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

В вашей рекурсивной функции, вы можете сделать это:

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

Другими словами, в то время как idx меньше someArray.length, ваше обещание разрешит другому обещание, на этот раз обещание, возвращаемый вызовом doRecursion() с idx увеличивается на единицу. Обратный вызов then не будет вызываться до тех пор, пока doRecursion не решит какое-либо значение, кроме обещания. В этом случае он в конечном итоге разрешит значение 'done!'.

При этом, если вы используете обещания, вам, вероятно, вообще не нужно использовать рекурсию. Возможно, вам придется немного переработать ваш код, но я бы предложил рассмотреть вариант ответа BenFortune в качестве альтернативы.

+0

Бит анти-шаблона ИМО, если вы используете обещания. –

+0

@BenFortune Да, я согласен, но это то, о чем спрашивал ассер. Я даже не думал об использовании рекурсии с обещаниями раньше, и это, наверное, почему. Ответчик должен подумать, что вы принимаете свой ответ. – McMath

Смежные вопросы