Как передать массив в URL как параметр в Promise.all - PullRequest
1 голос
/ 13 января 2020

Как передать массив url_user в качестве параметра в Promise.all?

Я использую Node.js и Express.

url_project = 'https://api.projects'
url_user = [
   'https://api.users/1',
   'https://api.users/2',
   'https://api.users/3',
   'https://api.users/4',
   'https://api.users/5',
   'https://api.users/6'
]

index. js

<div>
   <%= projectsApi.id %>
   <% for (var i = 0; i < usersApi.length; i++) { %>
        <%= usersApi[i].id %>
   <% } %>
</div>

сервер. js

var rp = require('request-promise');

Promise
     .all([rp({uri: url_project, json:true}), rp({uri: url_user, json:true})]) //This where I want to edit
     .then(([projectsApi, usersApi]) => {
         res.render('index', {projectsApi, usersApi});
     }).catch(err => {
         console.log(err);
         res.sendStatus(500);
     });

Когда я ставлю Promise.all([rp({uri: url_project, json:true}), rp({uri: url_user[0], json:true})]), он работает, так как url_user[0] не массив.

Однако я хочу передать все данные в массиве url_user.

Ответы [ 3 ]

0 голосов
/ 13 января 2020

Это должно работать:

const url_project = 'https://api.projects'

const url_user = [
   'https://api.users/1',
   'https://api.users/2',
   'https://api.users/3',
   'https://api.users/4',
   'https://api.users/5',
   'https://api.users/6'
]

const promises = [
  rp({uri: url_project, json:true}),
  ...url_user.map(value => rp({uri: value, json:true})
];

Promise
     .all(promises)
     .then(([projectsApi, ...usersApi]) => {
         res.render('index', {projectsApi, usersApi});
     }).catch(err => {
         console.log(err);
         res.sendStatus(500);
     });

Дайте мне знать, если есть какие-либо проблемы.

0 голосов
/ 13 января 2020

CodeBlock:

const rp = require('request-promise');
const _ = require('lodash'); //lodash is awesome, otherwise u can use JS map/concat

const projectUrl = 'https://api.projects';

const userUrls = [
  'https://api.users/1',
  ...,
  ...,
];

const promises =  
  _(projectUrl)
    .concat(userUrls)
    .map((requestUrl) -> rp({uri: requestUrl, json:true}))
    .value()

await Promise
  .all(promises)      
  .then((results) => {
    res.render('index', {projectsApi: results.shift(), usersApi: ...results});
  }).catch(err => {
    console.log(err);
    res.sendStatus(500);
  });

Объяснение:

Steps:
 - Get all requests together
 - Map over each using lodash or js map to get promises
 - Execute them together
 - Since project_url is the first request the result is the first item in array
 - Spread the reset of the result to get user results
0 голосов
/ 13 января 2020

Вы можете использовать map и оператор распространения :

url_project = 'https://api.projects'

url_user = [
   'https://api.users/1',
   'https://api.users/2',
   'https://api.users/3',
   'https://api.users/4',
   'https://api.users/5',
   'https://api.users/6'
]

const promises = [
  rp({uri: url_project, json:true}),
  ...url_user.map(value => rp({uri: value, json:true})
];

Promise.all(promises)
  .then(values => {
    console.log(values);
    // Adjust your response
    // ...
  })
  .catch(err => {
    console.log(err);
    res.sendStatus(500);
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...