Javascript 用承诺解析游标
我试图查询twitterapi,以便用户的追随者比较两者。我正在使用光标检索用户列表。我使用Promissions设置它,第一个get请求将用户的跟随者限制到一个极限,然后查找游标,将数据传递到数组中,然后使用游标的值解析为相同的循环函数,直到游标返回0,当这种情况发生时,我希望以res的形式发送所有内容。当我设置初始承诺并使用Javascript 用承诺解析游标,javascript,node.js,Javascript,Node.js,我试图查询twitterapi,以便用户的追随者比较两者。我正在使用光标检索用户列表。我使用Promissions设置它,第一个get请求将用户的跟随者限制到一个极限,然后查找游标,将数据传递到数组中,然后使用游标的值解析为相同的循环函数,直到游标返回0,当这种情况发生时,我希望以res的形式发送所有内容。当我设置初始承诺并使用promise.all来解决它们并附加一个。然后,承诺。一切先解决。我尝试从循环函数中解析承诺,然后将另一个承诺返回到第一个函数,但我似乎无法让它工作。有什么想法吗 c
promise.all
来解决它们并附加一个。然后
,承诺。一切先解决。我尝试从循环函数中解析承诺,然后将另一个承诺返回到第一个函数,但我似乎无法让它工作。有什么想法吗
const express=require(“express”);
const router=express.router();
const twitter=require(“../controllers/twitter”);
设object1={
参数:{
屏幕名称:“xxxx”,
计数:“40”
}
};
让对象={
参数:{
屏幕名称:“xxxxx”,
计数:“40”
}
};
让数据=[];
路由器.get(“,(请求、恢复、下一步)=>{
让one=getUserFollowers(“/1.1/followers/ids.json”,object);
让two=getUserFollowers(“/1.1/followers/ids.json”,object1);
所有([1,2]),然后(console.log);
});
函数getUserFollowers(uri、参数){
啁啾
.get(uri、参数)
。然后(resp=>{
设ids=resp.data.ids;
数据推送(…ID);
返回recurr(resp、uri、参数);
})
。然后(数据=>{
//如果我改为re console.log,我可以获取数据,但我需要将其解析回路由器,以便将其作为res发送。
返回新承诺((解决、拒绝)=>{
解析(数据);
拒绝(错误);
});
});
}
让recurr=(响应、uri、参数)=>{
如果(response.data.next_cursor>0){
params.params.cursor=response.data.next_cursor;
返回getUserFollowers(uri,参数);
}否则{
返回承诺。解析(数据);
}
};
module.exports=路由器代码>代码中的错误:
getUserFollowers
不返回任何内容-因此,让我们在twitter.get
.then(data => {
//if instead I re console.log the data I can get it, but I need to resolve it back in the router so I can send it as a res.
return new Promise((resolve, reject) => {
resolve(data);
reject(error);
});
});
出于几个原因,这毫无意义
你只能“完成”一个承诺一次,所以在“决心”之后加上“拒绝”意味着只执行“决心”李>
.then
始终返回承诺,因此当.then仅包含同步代码时,通常不需要承诺构造函数;及
你实际上在做的是一个不可操作的。。。您在中收到了数据
。然后,对其不做任何处理,并以一种复杂的方式从另一端返回数据
由于recurr
仅在内部调用。因此
您不需要保证使用承诺返回承诺。解决
-但是,我会完全失去recurr函数,在这样简单的代码中它只会使事情复杂化
您有一个全局data
变量,该变量包含由getUserFollowers
推送的数据,这一事实可能也会给您带来问题
重写以修复上述所有问题,您将获得:
const express = require("express");
const router = express.Router();
const twitter = require("../controllers/twitter");
let object1 = {
params: {
screen_name: "xxxx",
count: "40"
}
};
let object = {
params: {
screen_name: "xxxxx",
count: "40"
}
};
router.get("", (req, res, next) => {
let one = getUserFollowers("/1.1/followers/ids.json", object, []);
let two = getUserFollowers("/1.1/followers/ids.json", object1, []);
Promise.all([one, two]).then(console.log);
});
function getUserFollowers(uri, parameters, data) {
return twitter
.get(uri, parameters)
.then(resp => {
let ids = resp.data.ids;
data.push(...ids);
if (resp.data.next_cursor > 0) {
params.params.cursor = response.data.next_cursor;
return getUserFollowers(uri, params, data);
}
return data;
});
}
module.exports = router;
getUserFollowers
函数不返回任何内容-您的意思是return twitter.get。。。。。etc
返回新承诺((解析,拒绝)=>{解析(数据);拒绝(错误);})代码>-承诺只能“完成”一次。所以那个代码毫无意义。但是,整个。那么无论如何都可以被删除getUserFollowers
不会返回它所创建的承诺recurr
只会在内部调用。然后。。。您可以在您有返回承诺的地方返回数据如果我要重写你的代码,那将是一个开始