使用具有递归函数的承诺
Use promises with recursive function
我想弄清楚是否可以在递归函数中使用 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);
}
});
}
然而,那是行不通的。
将 val
推送到数组。如果 val.a
return 结果数组,否则调用 recursive
并使用 val
和累积结果数组作为参数。参见
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)});
}
});
}
如今,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);
}
}
鉴于您使用 val
作为结果参数调用回调,只需
return val;
来自 then
回调。就是这样。
function recursive(data){
return newThenable(data).then(function(val){
if (val.a){
return val;
} else {
return recursive(val);
}
});
}
我想弄清楚是否可以在递归函数中使用 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);
}
});
}
然而,那是行不通的。
将 val
推送到数组。如果 val.a
return 结果数组,否则调用 recursive
并使用 val
和累积结果数组作为参数。参见
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)});
}
});
}
如今,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);
}
}
鉴于您使用 val
作为结果参数调用回调,只需
return val;
来自 then
回调。就是这样。
function recursive(data){
return newThenable(data).then(function(val){
if (val.a){
return val;
} else {
return recursive(val);
}
});
}