簡體   English   中英

如何在返回值之前等待所有 .then 完成

[英]How to wait for all .then are finished before returning value

我有以下功能

const getQuotes = symbol => {
  let quotes = {};
  new DeltaRestClient(api_key, api_secret).then(client => {
    const linkOptions = createIdentifiers(symbol, false);
    Object.entries(linkOptions).forEach(entry => {
      client.apis.Products.getTicker({ symbol: entry[1] }).then(response => {
        const ticker = JSON.parse(response.data.toString());
        quotes[entry[0]] = parseFloat(ticker.result.close);
      });
    });
  });
  return quotes;
};

我調用的

const start = async () => {
  const quotes = await getQuotes("ABCD");
  console.log(quotes);
};

但是由於異步性,getQuotes 在所有 .then 被解析之前返回並返回一個空對象。

如何更改此設置,以便僅在解決所有 .then 時才返回該值?

您也必須在您正在調用的函數中等待:

const getQuotes = async symbol => {
  let quotes = {};
  const client = await new DeltaRestClient(api_key, api_secret);
  const linkOptions = createIdentifiers(symbol, false);

  for (const entry of Object.entries(linkOptions)) {
      const response = await client.apis.Products.getTicker({ symbol: entry[1] });
      const ticker = JSON.parse(response.data.toString());
      quotes[entry[0]] = parseFloat(ticker.result.close);
  }
  return quotes;
};

並相應地調用它:

const start = async () => {
  const quotes = await getQuotes("ABCD");
  console.log(quotes);
};

一般混合 async/await 和 Promise.then/.catch 會導致容易被誤解的陰暗代碼。

如果您願意,可以通過解構 entry 元素來提高可讀性:

  for (const [key, symbol] of Object.entries(linkOptions)) {
      const response = await client.apis.Products.getTicker({ symbol, });
      const ticker = JSON.parse(response.data.toString());
      quotes[key] = parseFloat(ticker.result.close);
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM