javascript - 用 promise 解决游标问题

标签 javascript node.js

我正在尝试查询 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);
  });
});

由于多种原因,这毫无意义。

  1. 你只能“完成”一个Promise一次,所以resolve后跟reject意味着只有resolve被执行...
  2. .then 始终返回一个 Promise,因此当 .then 仅包含同步代码时,通常不需要 Promise 构造函数;和
  3. 你实际上在做的是一个空操作...你在 .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/

相关文章:

javascript - 如何使用javascript删除div中的特定元素?

javascript - 将对象分配给变量的意外行为

javascript - Nodemon - 安装期间为 "clean exit - waiting for changes before restart"

javascript - 如何解决node js中的ReferenceError(var未定义)

node.js - 从 jsDoc 输出中排除外部内容

javascript - 没有 onScroll 的滚动速度更快?

javascript - 如何使用 PKCS7、CAdES、S/MIME (e-cpf/e-cnpj) 签署文档,以在浏览器上使用 javascript 创建 P7S 文件?

javascript - Openlayers 文本标签

javascript - jQuery window.matchMedia 冲突函数

javascript - node.js - Busboy 是如何工作的?