如何处理节点中的递归回调
How do I deal with recursive callback in node?
我正在使用罗宾汉节点API来检索我的证券投资组合。我使用的API有两个函数-
orders(callbackfn)
检索最近的100个订单和到下一页的链接。
url(url,callback)
获取下一页100多个订单。
这两个函数返回的JSON看起来像-
{
results:[
{order 0},
{order -1},
...
{order -100}],
next: url_for_next_page
}
现在,我需要将下一个url传递给url
函数以获得另外100个订单。最后一页有next: null
url
不能被调用,直到我处理orders
的结果。在处理之前的url
结果之前,不能调用后续的url。这导致我创建了一个回调地狱:-(order -> url -> url -> url…
不能在循环中调用url
方法。循环在回调执行之前继续执行。
如何重复调用url
?到目前为止,我已经使用递归函数调用管理了一个hack。这是我的代码- https://gist.github.com/lordloh/f5c8c589b4538ab9674db919ae2e2834
我正在学习节点js作为我去…: -/
您考虑过使用Promises
来避免回调地狱吗?
我看了一下你的代码,我用Promises
:
const credentials = {
username: 'username',
password: 'Password'
};
const Robinhood = require('../robinhood-node/src/robinhood');
function orderHandler(orderArray,allOs){
return new Promise((resolve, reject) =>
{
for (let i = 0; i < orderArray.length; i++) {
var e = orderArray[i];
var ss = e.instrument.split('/');
var instrument = ss[ss.length-2];
allOs.push({'id':e.id,
'instrument':instrument,
'quantity':e.quantity,
'price':e.average_price,
'side':e.side,
'transaction_time':e.last_transaction_at
});
}
resolve(allOs);
});
}
Robinhood(credentials, () =>
{
Robinhood.orders(function(e,r,b){
orderHandler(b.results,[]).then((allOs) =>
{
urlSequence(b.next, allOs).then((allOS) => csv(allOs));
});
});
});
function urlSequence(url,allOs){
if(!url)
return Promise.resolve(allOS);
return new Promise((resolve, reject) =>
{
Robinhood.url(url, (e,r,b) =>
{
orderHandler(b.results, allOS)
.then((allOs) => {
setTimeout(() => resolve(urlSequence(b.next, allOs)), 0);
});
});
});
}
function csv(Arr){
var A;
for (var i=0;i<Arr.length;i++){
A=Arr[i];
console.log(A.id+", "+A.instrument+", "+A.quantity+", "+A.price+", "+A.quantity+", "+A.side+", "+A.transaction_time);
}
}
假设我们有一个名为fetch
的函数它所做的就是获取一些数据并将其传递给回调函数,下面是它的实现方式:
function getAllPages(url, callback) {
// This is a function that returns a function:
const getPage = (oldData) => (response) => {
// We concat the data from the response to our collected list:
const newData = oldData.concat(response.results)
if(response.next && response.next.length) {
// Call the function returned by getPage passing in newData
// This is what we call recursion
fetch(response.next, getPage(newData))
} else {
// If there is no next page we just pass all the collected data to a callback:
callback(newData)
}
}
// We pass it an empty list as initial data:
getPage([])({next: url, results: []})
}
getAllPages('some url...', (data) => {
console.log(data)
})
我希望这会对你有所帮助。
如果页面太多,您可以使用setTimeout
轻松地添加一些限制或设置限制。
相关文章:
- 递归回调
- 带有回调的Javascript对象方法中的递归
- jQuery.fadeIn()和.fadeOut()回调在将代码重写为递归回调后无法正常工作
- 使用回调的递归Javascript函数不起作用
- 递归和传递 Ajax 回调
- 使用递归函数按顺序执行多个 ajax 请求,并在所有请求完成后执行回调函数
- 回调函数中的递归
- 如何"递归AJAX回调”;在JavaScript工作中
- 递归回调机制
- 什么'这是停止递归回调的最佳方法
- backbone.js集合-如何为fetch定义成功回调(不过是递归的)
- 如何在node.js中通过API回调异步递归
- 如何在异步递归方法完全就绪时创建回调
- 在递归函数中不能调用回调函数
- 节点集上的递归回调
- 使用回调来减慢循环的函数在递归使用时会变得混乱
- 对递归函数的回调
- 如何处理节点中的递归回调
- Node.js异步递归回调
- robot -递归回调- JavaScript