Связать json с обещанием: Как получить дополнительную пару значений ключа в объекте json из ожидающего обещания

#javascript #json #promise #fetch #node-fetch

Вопрос:

Я вручную связываю объект json с обещанием. Приведенный ниже код на первой печати, cosole.log(new_response), дает мне это, чего я и хочу

 Promise { <pending>, a: '123' }
 

Однако вторая печать, cosole.log(data_json_array), возвращает мне объект json без значения ключа, a: ‘123’

Я не знаю, почему это так. Я хотел бы, чтобы объект json включал значение ключа a: ‘123’, например:

 { 
  key1: "1",
  key2: "2",
  a: "123
}
 

Заранее спасибо.

 Promise.all(somefunction(parameter)).then(function (responses) {

        return Promise.all(responses.map(function (response) {

            new_json = {a: "123"}
            var new_response = Object.assign(response.json(), new_json)
            console.log(new_response)
            return new_response

      }.then(function (data) {

        console.log(data)

    })
 

Комментарии:

1. Возвращает ли какая-либо функция одно обещание или множество обещаний? Обещать. все это обычно делается для множества обещаний.

2. Потому response.json() что это тоже обещание.

3. @AlexanderStaroselsky это зависит от того, сколько URL я назову. Если два URL, то он возвращает обещание { <ожидание>, a: ‘123’ } Обещание { <ожидание><ожидание>, a: ‘123’ }

4. Кроме того, a: «123» предназначен только для демонстрационных целей, на самом деле значение ключа меняется для разных URL, которые я называю. Например, объект json, который я хочу добавить, может быть {url: «фактический URL»}

5. @Andy Возможно ли связать new_json с new_response так, чтобы они были одним объектом json в .then()?

Ответ №1:

Несколько иной подход может включать обновление someFunction для обработки json() и обработки объединения данных с предоставленным URL-адресом. Это может помочь избежать вложенных Promise.all :

 function someFunction(parameter) {
  // create array of promises
  return parameter.urls.map((url) =>
    fetch(url)
      // parse JSON
      .then((res) => res.json())
      // Merge data with url property
      .then((data) => ({ ...data, url }))
  );
}

Promise.all(
  someFunction({
    urls: [
      "https://jsonplaceholder.typicode.com/todos/1",
      "https://jsonplaceholder.typicode.com/todos/2",
    ],
  })
).then((data) => console.log(data)); 

Надеюсь, это поможет!

Комментарии:

1. Спасибо! Я посмотрю, как я могу интегрироваться в свой код, сообщу вам результат. Очень признателен.

2. Здорово. Дело в том, что вы можете сделать больше в функции someFunction, поскольку она создает обещания и имеет параметры. Вы всегда можете назначить дополнительный объект в потребителе для объединения дополнительных данных, но таким образом вам не придется иметь дело с json() на уровне потребителя.

3. Возвращаюсь сюда, чтобы сказать спасибо! Я успешно интегрировался в свой код! @Александр Старосельский