我试图弄清楚是否可以在递归函数中使用promises而不是标准回调。
我现在的方式:
function recursive(data, cb){
(function promiseProvider(data){
return newThenable(data).then(function(val){
if(val.a){
cb(null, val);
}
else {
return promiseProvider(val);
}
});
})(data);
}
这很有效,但我无法弄清楚如何实现纯粹的承诺。
也许这会起作用?
function recursive(data){
return newThenable(data).then(function(val){
if(val.a){
return // <<< ???
}
else {
return recursive(val);
}
});
}
但是,这不起作用。
答案 0 :(得分:4)
鉴于您使用val
作为结果参数调用回调,只需
return val;
来自then
回调的。就是这样。
function recursive(data){
return newThenable(data).then(function(val){
if (val.a){
return val;
} else {
return recursive(val);
}
});
}
答案 1 :(得分:3)
将val
推送到数组。如果val.a
返回结果数组,则使用recursive
调用val
并将结果数组作为参数累积。见multiple, sequential fetch() Promise
function recursive(data, results) {
return newThenable(data).then(function(val) {
if (val.a) {
// results.push(val);
return results
} else {
results.push(val);
return recursive(val, results).catch(function(e) {console.log(e)});
}
});
}
答案 2 :(得分:2)
现在ES8 async / await使它更具可读性。我暂时跳过了try-catch。
async function recursive(data, results = []) {
let val = await newThenable(data);
if (val.a) {
return results
} else {
results.push(val);
return recursive(val, results);
}
}