Feature/8 return a promise (#5) (#6)

* Resolve "Pass Entire JSON String to the user"

* Add a promise function

* Adjust documentation

* Fix ci issues

* Fix ci issues 2

Co-authored-by: Ethan Lane <ethan.lane@influentialsoftware.com>

Co-authored-by: Ethan Lane <ethan.lane@influentialsoftware.com>
This commit is contained in:
Vylpes 2021-04-12 20:30:59 +01:00 committed by GitHub
parent a215341fe5
commit 28cbfe5f46
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 69 additions and 2 deletions

View file

@ -58,10 +58,64 @@ function randomBunny(subreddit, sortBy, cb) {
}); });
} }
function promise(subreddit, sortBy) {
return new Promise(resolve => {
// If the sortable list doesn't include sortBy, default to 'hot'
if (!sortable.includes(sortBy)) sortBy = 'hot';
// Fetch the json from reddit
// For example, if you're getting a random image from r/rabbits, sorted by new:
// https://www.reddit.com/r/rabbits/new.json
fetch(`https://www.reddit.com/r/${subreddit}/${sortBy}.json`).then(res => {
res.json().then(res => {
// Get the part of the json string which the data comes from
const data = res.data.children;
const size = data.length;
// Found is used for the while loop in order to break out of the loop.
// We need to loop as the json string will contain invalid data for what we need
// Specifically videos.
let found = false;
// Loop until a valid image post is found
while (!found) {
// Generate random number
const random = getRandom(0, size - 1);
// Get variables from json to pass back
const randomSelect = data[random].data;
// The json string to send back
const json = {
archived: randomSelect['archived'],
downs: randomSelect['downs'],
hidden: randomSelect['hidden'],
permalink: randomSelect['permalink'],
subreddit: randomSelect['subreddit'],
subredditSubscribers: randomSelect['subreddit_subscribers'],
title: randomSelect['title'],
ups: randomSelect['ups'],
url: randomSelect['url']
};
// If the post is a .jpg, send back the data and stop looping
if (json.url.includes('.jpg')) {
found = true;
resolve(json);
}
}
});
});
})
}
// Generate a random number // Generate a random number
function getRandom(min, max) { function getRandom(min, max) {
return Math.floor((Math.random() * max) + min); return Math.floor((Math.random() * max) + min);
} }
// Export Functions // Export Functions
module.exports = randomBunny; module.exports = {
randomBunny,
promise,
};

View file

@ -12,13 +12,20 @@ $ npm install --save random-bunny
## Usage ## Usage
```js ```js
const randomBunny = require('random-bunny'); const { randomBunny } = require('random-bunny');
randomBunny('rabbits', 'new', res => { randomBunny('rabbits', 'new', res => {
console.log(res.title + ": " + res.url); console.log(res.title + ": " + res.url);
}); });
``` ```
```js
const { promise } = require('random-bunny');
promise('rabbits', 'new').then((res) => {
console.log(res.title);
});
```
## API ## API
@ -37,6 +44,12 @@ The json string which gets returned consists of:
- ups - ups
- url - url
### `promise()`
Returns a `json string` for a random post in a `promise`. Accepts 2 arguments: `subreddit`, `sortby` ('new', 'hot', 'top').
The json string returned in the promise consists of the same above.
## Notes ## Notes
* Node 4 or newer. * Node 4 or newer.