Отображение обещания, которое возвращает foo, другому обещанию, которое возвращает bar? - PullRequest
0 голосов
/ 28 апреля 2019

У меня есть функция, которая создает XMLHttpRequest и возвращает обещание с ответом на запрос.

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

Например, вместо обещания с разрешением response = {status, data} и т. Д., Я хотел бы вернуть только response.data.some_field

Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 28 апреля 2019

Если вы вызовете .then для обещания, вы создадите другое обещание, которое будет преобразовано во все, что вы возвращаете в функции обратного вызова.Поэтому возьмите текущее обещание, которое вы создаете, а затем добавьте следующее:

.then((response) => {
  return response.data.some_field;
});

Так что, возможно, полная функция будет выглядеть так:

function getStuff() {
   return new Promise((resolve, reject) => {
     //somethingWithXMLHttpRequest      
   }).then((response) => {
      return response.data.some_field;
   });
}
1 голос
/ 28 апреля 2019

То, что вы ищете, это цепочка обещаний . Ссылка ведет на страницу документации Mozilla по цепочке обещаний.

function httpRequestAsync () {
    // Return a promise... This is where your XMLHttpRequest takes place
}

function getStuffAsync() {

   // Make your http request, chain the return promise, 
   // and return a promise, which resolves to the chosen field.
   return httpRequestAsync() //Calling .then() on this promise is promise chaining.
       .then((response) => { 
          return response.data.some_field;
       });
}

function someBusinessLogicFunction () {

     let yourString = "";

     getStuffAsync()
         .then((response) => {
              yourString = response; // yourString does in fact equal the response param... :).catch(() => {
               console.log("Something went wrong, or this answer sucks ha ha!");
          }); 
     }) 
}


// Or using async/await, for fun

async someBusinessLogicFunction2 () {

     let yourString = "";

     try {
         yourString = await getStuffAsync();
     } catch (e) {
         console.log("Something went wrong, or this answer sucks ha ha!");
     }
}

Мой пример разбивает ваш HTTP-запрос на одну функцию с объявленной другой функцией, которая вызывает эту функцию и выполняет цепочку обещаний. Вы можете опустить вторую функцию и вернуть связанное обещание из функции, выполняющей HTTP-запрос.

0 голосов
/ 28 апреля 2019

У вас есть что-то подобное (полученное из вашего блока кода до того, как вы отредактировали вопрос)

 const promise = axios
    .post(url("fistbump"), data)
    .then(result => {
      window.console.log("Got fistbump response: ", result.data);
      localStorage.setItem(ACCOUNT_TOKEN_FIELD, result.data.key);
    });

  return promise;

Если обещание Axios соответствует спецификации обещания ES6, вы можете просто вернуть то, что вы хотите, из .then предложение, чтобы получить значение, заключенное в обещание, которое дает вам

 const promise = axios
    .post(url("fistbump"), data)
    .then(result => {
      window.console.log("Got fistbump response: ", result.data);
      localStorage.setItem(ACCOUNT_TOKEN_FIELD, result.data.key);
      return result.data;
    });

  return promise;
...