Есть ли способ распаковать обещание один раз, а потом каждый раз? - PullRequest
0 голосов
/ 25 мая 2019

Я запускаю ajax POST на сервере для получения данных JSON в качестве обещания и ищу способ распаковать обещание и получить само [[PromiseValue]] (фактические данные) без необходимости использовать вложенный .then () каждый раз. Концептуально, могу ли я распаковать данные один раз (возможно, когда я верну новое обещание), чтобы я мог просто использовать async await и затем начать манипулировать данными после того, как они (надеюсь) были разрешены? Вот мой минимальный воспроизводимый пример:

var data = getData();
useData(data);

async function getData() {
  return new Promise((resolve, reject) => {
    resolve({one: 1, two: 2, three: 3});
    return;
  });
};

//This is what I would like to have
async function useData(data) {
  await data;
  console.log(data);  //which I'd like to return the value within [[PromiseValue]]
};

//This is my working version
async function unpackData(data) {
  await data.then((res)=> {
    console.log(res);
  });
};

В настоящее время я использую unpackData () вместо useData (), поскольку useData () записывает в журнал само обещание, а не данные, но я бы хотел метод, который позволяет мне работать с PromiseValue после данных await; линия.

Ответы [ 3 ]

1 голос
/ 25 мая 2019

Может быть, я неправильно понимаю, но почему бы и нет?

async function useData() {
  const data = await getData();
  console.log(data);
}

И если вы хотите использовать одно и то же обещание каждый раз:

async function getData() {
  if (!getData.promise) {
    getData.promise = new Promise((resolve, reject) => {
      resolve({one: 1, two: 2, three: 3});
    });
  }
  return getData.promise;
};

0 голосов
/ 25 мая 2019

Вы не можете передавать данные, тогда ждите их. Данные должны ожидаться, затем передаваться, иначе вы передаете Promise, а не данные. Передача Promise не нужна и не очень хорошая идея.

Либо .then(), либо await выполнят эту работу. Разница только синтаксическая. В общем, старайтесь не смешивать два.

// either
getData().then(useData);

// or (IIFE-wrapped unless already inside an asyncFunction)
(async function() {
    useData(await getData());
})();

Ни getData(), ни useData() не должны быть asyncFunction, если они не используют await.

function getData() {
    return Promise.resolve({'one': 1, 'two': 2, 'three': 3});
};

function useData(data) {
    console.log(data);
};
0 голосов
/ 25 мая 2019

Ооо, так близко:

async function useData(data) {
  const unpackedData = await data;
  console.log(unpackedData);  
};
...