обработка нескольких обещаний в AWS Lambda - PullRequest
0 голосов
/ 28 июня 2018

Я пытаюсь использовать лямбда-функцию для получения новостей о хакерах, используя их API. Подход, кажется, работает, если я создаю это как обычное задание Nodejs cron, но как лямбда-функция просто завершается успешным вызовом без какого-либо вывода. Ниже мой код

const PromisePool = require("es6-promise-pool");
const rp = require("request-promise");

const getTopStories = async () => {
  let options = {
    method: "GET",
    uri: "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty",
    headers: {
      'Content-Type': 'application/json'
    },
    json: true
  };
    return rp(options).then(stories => {
      return (stories);
    })
    .catch(err => err);
}

const getStoryDetails = (storyId) => {
  let url = "https://hacker-news.firebaseio.com/v0/item/"+storyId+".json?print=pretty";
  let options = {
    method: "GET",
    uri: url,
    headers: {
      'Content-Type': 'application/json'
    },
    json: true
  };
  return new Promise((resolve, reject) => {
    rp(options)
    .then(response => {
      if(response.type === "story"){
        resolve({
          story_id: response.id,
          pubDate: response.time,
          title: response.title,
          url: response.url,
          provider: "Hacker News",
          type: response.type,
          status: "NEW"
        });
      }
    })
    .catch(err => reject(err));
  });
}


let stories = [];

let promiseProducer = async (sList) => {
    stories = await sList.map(id => getStoryDetails(id));
    return stories;
}

exports.hknFeed = async (event) => {
    let idList = await getTopStories();
    console.log(idList);
    let pool = new PromisePool(promiseProducer(idList), 4);
    let poolPromise = pool.start();
    poolPromise.then(() => {
        Promise.all(stories).then(values => {
            console.log(values);
        })
    })
    return idList;
};

Может кто-нибудь указать, что мне не хватает, чтобы заставить это работать.

Примечание: getTopStories возвращает массив из 500 значений, что вызывает слишком большое количество запросов, и я предполагаю, что это где-то вызывает ошибку сокета. Но если мы ограничим возвращаемый массив массивом из 10-15 значений, то приведенный выше код работает, и Promise.all разрешает каждое обещание и выводит значение в консоль.

1 Ответ

0 голосов
/ 28 июня 2018

Ответ: Извинения ... кажется, что я не обращал внимания. Приведенный выше код теперь работает в лямбда-функции, так как мой оператор return был неуместен. Он должен был быть внутри Promise.all (). Then (() => {return}). как показано ниже

const PromisePool = require("es6-promise-pool");
const rp = require("request-promise");

const getTopStories = async () => {
  let options = {
    method: "GET",
    uri: "https://hacker-news.firebaseio.com/v0/topstories.json?print=pretty",
    headers: {
      'Content-Type': 'application/json'
    },
    json: true
  };
    return rp(options).then(stories => {
      return (stories);
    })
    .catch(err => err);
}

const getStoryDetails = (storyId) => {
  let url = "https://hacker-news.firebaseio.com/v0/item/"+storyId+".json?print=pretty";
  let options = {
    method: "GET",
    uri: url,
    headers: {
      'Content-Type': 'application/json'
    },
    json: true
  };
  return new Promise((resolve, reject) => {
    rp(options)
    .then(response => {
      if(response.type === "story"){
        resolve({
          story_id: response.id,
          pubDate: response.time,
          title: response.title,
          url: response.url,
          provider: "Hacker News",
          type: response.type,
          status: "NEW"
        });
      }
    })
    .catch(err => reject(err));
  });
}


let stories = [];

let promiseProducer = async (sList) => {
    stories = await sList.map(id => getStoryDetails(id));
    return stories;
}

exports.hknFeed = async (event) => {
    let idList = await getTopStories();
    console.log(idList);
    let pool = new PromisePool(promiseProducer(idList), 4);
    let poolPromise = pool.start();
    poolPromise.then(() => {
        Promise.all(stories).then(values => {
            console.log(values);
            return values;
        })
    })
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...