有没有一种方法可以在没有.then的情况下一次解开承诺?

时间:2019-05-25 02:41:29

标签: javascript node.js asynchronous promise async-await

我正在向服务器运行ajax POST以接收作为承诺的JSON数据,我正在寻找一种解压缩承诺并获得[[PromiseValue]]本身(实际数据)的方法,而不必使用每次嵌套.then()。从概念上讲,我可以将数据解压缩一次(也许当我返回新的Promise时),以便我可以使用异步等待,然后(希望)在解决数据后开始处理数据?这是我的最小可重现示例:

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()记录了promise本身而不是数据,但是我很喜欢一种让我在等待数据之后使用PromiseValue的方法。线。

3 个答案:

答案 0 :(得分:1)

也许我误会了,但是为什么不呢?

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;
};

答案 1 :(得分:0)

哦,好了,

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

答案 2 :(得分:0)

您不能传递数据然后等待它。必须等待数据,然后再传递数据,否则,您传递的是increment,而不是数据。通过decrement是不必要的,也不是一个好主意。

PromisePromise都可以做。区别只是语法上的。通常,尽量不要将两者混在一起。

.then()

await// either getData().then(useData); // or (IIFE-wrapped unless already inside an asyncFunction) (async function() { useData(await getData()); })(); 都不需要成为asyncFunction,除非它们使用getData()

useData()