2015-10-01 3 views
2

Как написать функцию обещания, которая рекурсивно называет себя? То, что я закончил, похоже на приведенное ниже.Рекурсивно вызывая функцию обещания

function myPromiseFunction(input) { 
    return new Promise(function(resolve, reject) { 
     //compute something with input and got new input so again calling 
     //myPromiseFunction 
     if (newInput) { 
      return myPromiseFunction(new input); 
     } 
     else { 
      resolve(output); 
     } 
    }); 
} 
myPromiseFunction(input).then(function(output) { 
    console.log("completed processing data with input"); 
}); 

Ничего не регистрируется, когда я запускаю код. Что я здесь делаю неправильно?

+0

Что вы сделали правильно. Что такое 'input'? Можете ли вы показать минимальный воспроизводимый пример? Кроме того, убедитесь, что вы также добавили обработчик отклонения – thefourtheye

+0

@thefourtheye - не уверен в правильности –

+0

@JaromandaX Не могли бы вы указать, что на самом деле неправильно? – thefourtheye

ответ

3

Не использовать explicit construction.

Если есть использовать его, resolve усваивает обещания, переданные в него:

function myPromiseFunction(input) { 
    return new Promise(function(resolve, reject) { 
     //compute something with input and got new input so again calling 
     //myPromiseFunction 
     if (newInput) { 
      resolve(myPromiseFunction(newInput)); // will wait for inner promise 
     } 
     else { 
      resolve(output); 
     } 
    }); 
} 

Цитирование спецификации:

Функция решительность, которая передается в функцию исполнителя принимает один аргумент. Код исполнителя может в конечном итоге вызвать функцию разрешения, чтобы указать, что он хочет разрешить связанный объект Promise. Аргумент, переданный функции разрешения, представляет собой конечное значение отложенного действия и может быть либо фактическим значением выполнения , либо другим объектом Promise, который предоставит значение, если оно выполнено.

+0

Мне нравится слово «ассимилирует». –

+0

Я согласен не использовать явное построение; как бы избежать этого в этом случае? –

+0

@torazaburo Я не выбрал его, вероятно [@Domenic] (http://stackoverflow.com/users/3191/domenic) (в https://promisesaplus.com/). Я могу помочь с его преобразованием, если бы знал, что представляет собой настоящий код - вроде как ваш ответ. –

0

Я предполагаю, что «вычислить что-то с вводом» является асинхронной частью этого потока и что он возвращает обещание, разрешающее [output, newInput]. Пожалуйста, исправьте меня, если это предположение неверно.

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

function getOutput(input) { 
    return computeSomething(input) . 
    then(([output, newInput]) => newInput ? getOutput(newInput) : output); 
} 
Смежные вопросы