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 + promises 片段

Node.js assert.throws 带有异步函数(Promises)

Node.js:何时使用 Promises 与 Callbacks

使用 Javascript(以及 Node.js)使用 async/await 和 Promises 的正确方法是啥 [重复]

无法通过递归调用node.js中的函数从promises获得响应

在Node JS中使用promises