【问题标题】:Is there a way to unpack a promise once without .then each time?有没有办法在没有 .then 的情况下每次都解开一个承诺?
【发布时间】:2019-05-25 11:32:38
【问题描述】:

我正在向服务器运行 ajax POST 以接收 JSON 数据作为承诺,我正在寻找一种方法来解包承诺并获取 [[PromiseValue]] 本身(实际数据)而无需使用每次嵌套一个 .then() 。从概念上讲,我可以解压一次数据(也许当我返回新的 Promise 时),以便我可以使用 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() 记录的是 Promise 本身而不是数据,但我喜欢一种方法,它可以让我在等待数据之后使用 PromiseValue;行。

【问题讨论】:

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


    【解决方案1】:

    也许我理解错了,但为什么不是这个?

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

    如果你想每次都重用同一个promise:

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

    【讨论】:

      【解决方案2】:

      哦,这么近:

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

      【讨论】:

        【解决方案3】:

        你不能传递数据然后等待它。必须等待数据,然后传递,否则,您传递的是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);
        };
        

        【讨论】:

          猜你喜欢
          • 2020-05-12
          • 1970-01-01
          • 2023-03-15
          • 2021-05-01
          • 2023-03-16
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          相关资源
          最近更新 更多