Node.js、Promises & Recursion - 可能吗?
Posted
技术标签:
【中文标题】Node.js、Promises & Recursion - 可能吗?【英文标题】:Node.js, Promises & Recursion - Possible? 【发布时间】:2015-07-12 11:15:46 【问题描述】:我想从贝宝检索交易,直到没有更多交易可以检索。 我想在使用递归函数时这样做。 我不知道该怎么做。 有可能吗?
我可以进行递归,但不能聚合事务并将它们传递到函数之外。
为简单起见,我删除了不相关的行。
this.retrieveAllTransactionsBetween = function(end_date, start_date)
return getTransactions(
STARTDATE: Moment(start_date).format().replace('+00:00', 'Z'),
ENDDATE: Moment(end_date).format().replace('+00:00', 'Z')
)
.then(function(transactions)
if (end) // test for end of transactions
return [];
console.log('finish transactions in iteration where earliest was',earliest.toDate());
return transactions.concat(retrieveAllTransactionsBetween(earliest.toDate(), start_date, customer_id));
)
.catch(function(e)
console.error('getAllTransactionsBetween general error', e);
)
;
;
this.getTransactions = function(dates)
var stringified_api_call_param = QueryString.stringify(api_call_params);
return new Promise(function(resolve, reject)
var sequence = Sequence.create();
sequence
.then(function (next)
api_call_options.headers =
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': Buffer.byteLength(stringified_api_call_param)
;
var req = https.request(api_call_options, paypal_helpers.paypalCallbackWrapper(next));
req.on('error', function(e)
return reject(e.message);
);
req.write(stringified_api_call_param);
req.end();
)
.then(function (next, res)
return resolve(res);
);
);
;
【问题讨论】:
您需要一个超出嵌套函数范围的集合变量。它不必是全局的,只需将其定义为主例程的兄弟,以便内部函数可以访问它。您还可以将对象/数组绑定()到其中一个内部函数,为其命名,然后在内部函数中使用该名称以作为 this 访问集合,否则不会使用. 【参考方案1】:这部分错了:
return transactions.concat(retrieveAllTransactionsBetween(earliest.toDate(), start_date, customer_id));
你想等待递归调用,.concat
是一个数组函数。你应该等待它:
return retrieveAllTransactionsBetween(earliest.toDate(), start_date, customer_id).
then(function(more) return transactions.concat(more); );
【讨论】:
是的!谢谢,这就是我所缺少的。太棒了!以上是关于Node.js、Promises & Recursion - 可能吗?的主要内容,如果未能解决你的问题,请参考以下文章
Node.js assert.throws 带有异步函数(Promises)
Node.js:何时使用 Promises 与 Callbacks
使用 Javascript(以及 Node.js)使用 async/await 和 Promises 的正确方法是啥 [重复]