Как изменить ответ API с помощью Javascript - PullRequest
2 голосов
/ 14 февраля 2020

Я написал это маленькое приложение, которое принимает набор символов звездных войн и возвращает изображения в массиве.

const app = require('express')(); 
const fetch = require('node-fetch');
const imageSearch = require('image-search-google');
const bodyParser = require('body-parser')

var urlencodedParser = bodyParser.urlencoded({ extended: true })
app.use(bodyParser.json())


const options = {page:1};


const getImages = (keywords) =>
 Promise.all(keywords.map(keyword => client.search(`${keyword} Wookieepedia`, options)))
 .then(data => firstResult = data.map(result => result[0].url)); 


 const fun = async () => {
     const res = await getImages(['yoda' , 'luke skywalker' , 'darth vader']);
     console.log(res);
 }

 fun()

Результат приведенного выше кода выглядит следующим образом:

[ 'https://vignette.wikia.nocookie.net/starwars/images/d/d6/Yoda_SWSB.png/revision/latest?cb=20150206140125',
  'https://vignette.wikia.nocookie.net/starwars/images/d/d9/Luke-rotjpromo.jpg/revision/latest?cb=20091030151422',
  'https://vignette.wikia.nocookie.net/starwars/images/a/a3/ANOVOS_Darth_Vader_1.png/revision/latest?cb=20150128225029' ]

Но я хотел бы получить результат, в котором я могу узнать, какое изображение принадлежит какому ключевому слову. Может быть, такой формат или что-то похожее:

[{<keyword> : <url>}]

Я пробовал это:

const getImages = (keywords) =>
 Promise.all(keywords.map(keyword => {return { [keyword] : [client.search(`${keyword} Wookieepedia`, options)]}    } ))
 .then(data => firstResult = data.map(result => result)); 


 const fun = async () => {
     const res = await getImages(['yoda' , 'luke skywalker' , 'darth vader']);
     console.log(res);
 }

 fun()

Результаты были близки, но не хороши:

[ { yoda: [ [Promise] ] },
  { 'luke skywalker': [ [Promise] ] },
  { 'darth vader': [ [Promise] ] } ]

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

client.search возвращает обещание. Его можно ожидать внутри функции отображения, если вы установите функцию отображения asyn c.

const getImages = (keywords) =>
    Promise.all(keywords.map(async keyword => {
        return {[keyword]: await client.search(`${keyword} Wookieepedia`, options)}
    }));
1 голос
/ 14 февраля 2020

Без использования async вы можете добавить предложение then к поисковому обещанию, которое объединяет значение ключевого слова с массивом результатов или с первым результатом, как показано:

const getImages = keywords => Promise.all(
     keywords.map( keyword =>
         client.search(`${keyword} Wookieepedia`, options)
        .then( result => ( {[keyword]: result[0]} ))
     )
)
1 голос
/ 14 февраля 2020
const getImages = (keywords) =>
 Promise.all(keywords.map(keyword => client.search(`${keyword} Wookieepedia`, options).then(result => [keyword, result])))
 .then(entries => Object.fromEntries(entries))
 .then(data => firstResult = data.map(result => result)); 

 const fun = async () => {
     const res = await getImages(['yoda' , 'luke skywalker' , 'darth vader']);
     console.log(res);
 }

 fun()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...