2015-11-15 7 views
2

Я использую собственные node.js's Promises, и вопрос here действительно дал мне какой-либо момент. В принципе, у меня есть функция, как показано ниже:Обещание - попробуйте, пока он не достигнет

var foo = foo (resolve, reject) { 
    return obj 
     .doA() 
     .doB() 
     .then(function (value) { 
      // here I choose if I want to resolve or reject. 
     }) 
     .catch(function(err) { 
     }); 
} 

var promise = new Promise(foo); 

return promise 
    .then(function() { 
     // I know here what I have to return. 
    }) 
    .catch(function(err){ 
     // I want to repeat the foo function until it is resolved and not rejected. 
    }) 

obj обетованная объект. Я хотел бы повторить функцию foo, пока выполняется обещание; если он отклонен, повторите попытку.

Я не знаю, как структурировать цепочку. Любая помощь? Спасибо.

+1

Пока обещание выполнено, и до тех пор, как обещание отвергается являются _super_ похожи. Единственное различие заключается в проверке '.catch' vs'. Then' - вы можете вместо этого спросить, как преобразовать отклоненное обещание в отработанное и наоборот. Определенно дубликат. –

+0

Ответы в этом дубликате кажутся слишком сложными и плохо подходят для этой проблемы - IMHO - и не могут решить некоторые основные проблемы с этим кодом, например. нет необходимости в 'новом обещании' в этом коде вообще –

+0

@BenjaminGruenbaum дубликат? Я не видел вопроса о завершении обещания до тех пор, пока он не будет выполнен с помощью собственных обещаний node.js. Пожалуйста, поделитесь ссылкой. Благодарю. –

ответ

1

Try включая function в декларации foo, используя рекурсию

function foo() { 
 

 
    var n = String(new Date().getTime()).slice(-1); 
 
    // if `n` < 5 reject `n` , else resolve `n` 
 
    return Promise[n < 5 ? "reject" : "resolve"](n) 
 
    .then(function(value) { 
 
     return value 
 
     // here I choose if I want to resolve or reject. 
 
    }) 
 
    .catch(function(err) { 
 
     return Promise.reject(["rejected", err]) 
 
    }); 
 
} 
 

 
(function repeat() { 
 
    var promise = Promise.resolve(foo()); 
 

 
    return promise 
 
    .then(function(data) { 
 
     console.log("complete", data) 
 
     // I know here what I have to return. 
 
    }) 
 
    .catch(function(err) { 
 
     // I want to repeat the foo function until it is resolved and not rejected. 
 
     console.log(err); 
 
     if (err[0] === "rejected") repeat() 
 
    }) 
 
}())

+1

не могли бы вы лучше объяснить? где решаются и отклоняются дескрипторы? –

+0

@BrunoBruzzano _ "где разрешать и отклонять дескрипторы?" _? На 'foo'. Если обещание отклонено в 'foo', вызовите' repeat' рекурсивно до тех пор, пока 'foo' не вернет разрешенное значение обещания – guest271314

+0

@BrunoBruzzano См. Обновленное сообщение, включенные стеки, чтобы продемонстрировать подход – guest271314

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