我正在尝试查询 Twitter API 以获取用户的关注者来比较两者。我正在使用光标来检索用户列表。我使用 Promise 进行设置,其中第一个 get 请求使用户关注者达到限制,然后查找游标将数据传递到数组中,然后将游标的值解析为相同的重复函数,直到游标返回0,当发生这种情况时,我想将其全部发送到 res.当我设置初始 promise 并使用 promise.all
解决它们并附加 .then
时, promise 。一切先解决。我尝试解决重复函数的 promise ,然后将另一个 promise 返回给第一个函数,但我似乎无法让它工作。有什么想法吗?
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"
}
};
let data = [];
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) {
twitter
.get(uri, parameters)
.then(resp => {
let ids = resp.data.ids;
data.push(...ids);
return recurr(resp, uri, parameters);
})
.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);
});
});
}
let recurr = (response, uri, params) => {
if (response.data.next_cursor > 0) {
params.params.cursor = response.data.next_cursor;
return getUserFollowers(uri, params);
} else {
return Promise.resolve(data);
}
};
module.exports = router;
最佳答案
代码中的错误:
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);
});
});
由于多种原因,这毫无意义。
- 你只能“完成”一个Promise一次,所以resolve后跟reject意味着只有resolve被执行...
.then
始终返回一个 Promise,因此当 .then 仅包含同步代码时,通常不需要 Promise 构造函数;和- 你实际上在做的是一个空操作...你在 .then 中收到了
data
,没有做任何事情,并且以一种复杂的方式从另一端返回了数据
由于 recurr
仅在 .then
内部调用,因此您不需要保证使用 Promise.resolve
返回 Promise > - 但是,我会完全失去 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;
关于javascript - 用 promise 解决游标问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52998467/