[英]How to call promise function recursively
我試圖使用javascript promises遞歸調用異步函數,但沒有找到一個有效的模式。
這是我想象的工作方式:
var doAsyncThing = function(lastId){
new Promise(function(resolve, reject){
// async request with lastId
return resolve(response)
}
}
var recursivelyDoAsyncThing = function(lastId){
doAsyncThing(lastId).then(function(response){
return new Promise(function(resolve, reject){
//do something with response
if(response.hasMore){
//get newlastId
return resolve(recursivelyDoAsyncThing(newLastId));
}else{
resolve();
}
});
});
}
recursivelyDoAsyncThing().then( function(){
console.log('done');
});
為什么這不起作用? 我誤解了什么?
有沒有更好的模式來解決這個問題?
recursivelyDoAsyncThing
需要返回Promise才能繼續鏈。 在您的情況下,您需要做的就是讓doAsyncThing
返回其Promise:
var doAsyncThing = function(lastId){
// Notice the return here:
return new Promise(function(resolve, reject){
然后將return
到doAsyncThing
調用,如下所示:
var recursivelyDoAsyncThing = function(lastId){
// Notice the return here:
return doAsyncThing(lastId).then(function(response){
你在recursivelyDoAsyncThing
函數中錯過了一個return
。 你也應該避免使用Promise
構造函數反模式 :
function recursivelyDoAsyncThing(lastId) {
return doAsyncThing(lastId).then(function(response) {
//^^^^^^
//do something with response
if (response.hasMore) {
//get newlastId
return recursivelyDoAsyncThing(newLastId);
} else {
return; // undefined? Always return a useful value
}
});
}
我有一個簡單的遞歸承諾的例子。 該示例基於數字的計算factorial
。
let code = (function(){ let getFactorial = n =>{ return new Promise((resolve,reject)=>{ if(n<=1){ resolve(1); } resolve( getFactorial(n-1).then(fact => { return fact * n; }) ) }); } return { factorial: function(number){ getFactorial(number).then( response => console.log(response) ) } } })(); code.factorial(5); code.factorial(6); code.factorial(7);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.