gpt4 book ai didi

javascript - 如何处理 Node 中的递归回调?

转载 作者:行者123 更新时间:2023-12-03 05:53:27 25 4
gpt4 key购买 nike

我正在使用Robinhood-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。在处理完前面的 url 结果之前,无法调用后续的 url。这导致我创建了一个回调 hell :-( order -> url -> url -> url ...

我无法在循环中调用url方法。在回调执行之前,循环继续执行。

如何重复调用url?到目前为止,我已经使用递归函数调用进行了黑客攻击。这是我的代码 - https://gist.github.com/lordloh/f5c8c589b4538ab9674db919ae2e2834

我正在学习 Node js...:-/

最佳答案

您是否考虑过使用Promises避免回调 hell ?

我看了你的代码,我想象使用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);
}
}

关于javascript - 如何处理 Node 中的递归回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40047987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com