簡體   English   中英

如何從非異步函數的 Web 調用異步函數

[英]How to call async function from web of non-async functions

我正在一個中型 node.js 應用程序中工作,該應用程序具有一系列調用其他同步函數等的同步函數。為了簡單起見,我們只說這些函數在此之前都沒有返回 Promises。

function a(){
  ...
  return c();
}
function b(){
  ...
  return c();
}
function c(){
  ...
  return e();
}
function d(){
  ...
  return e();
}
function e(){
   // Do stuff
}

它實際上比這復雜得多,並且還有一整套調用這些函數的單元/集成測試。

我們現在需要函數 e() 來等待異步函數的結果:

function e(){
   const someData = await someAsyncFunction();
   const dataINeedNow = someData.dataINeedNow;
   // Do something with dataINeedNow
}

async function someAsyncFunction(){
  ...
  return await someExternalService();
}

似乎普遍的看法是,一旦開始返回 Promise,就應該繼續返回 Promise。 在上面的示例中,這將涉及使 a、b、c、d 和 e 全部async ,但實際上它會在我們的應用程序中涉及約 100 處更改。

有沒有辦法進行一次調用await someExternalService(); 在沒有重大重構的 node.js 應用程序的內部?

您可能應該重寫整個鏈以返回承諾以保持一致性並且不會使您的代碼非常混亂。

但是,根據您編寫問題的方式,如果您真的返回每個后續調用的結果,您可以在巢外處理承諾結果。

返回function e的承諾,該承諾將一直返回到您的原始調用

    function e(){
        console.log("did e");
        const prom = new Promise((resolve)=>{
            setTimeout(()=>{
              console.log("resolved async");
              resolve("dataResolve")
            },1000)      
        });
        return prom;
    }

Do something with dataINeedNow

a().then((resArg)=>{
    f(resArg);
})

在這里看一個例子

你可以

function e(){
  someAsyncFunction().then((someData)=>{
     const dataINeedNow = someData.dataINeedNow;
     // Do something with dataINeedNow
  });
   
}

只需使用then/catch處理e()中的 Promise。

你的e()看起來像:

function e(){
   someAsyncFunction()
   .then(data => {
      const dataINeedNow = data.dataINeedNow;
      // Do something with dataINeedNow;
    })
   .catch(e => {
        // Do something if someExternalService throws rejection
        console.log(e);
    })
}

function someAsyncFunction(){
  ...
  // This works provided someExternalService() returns a Promise.
  return someExternalService();
}

async/await 只是 Promise 處理的語法糖。 我不喜歡它,因為它為不想學習如何在 JavaScript 中正確處理並發的開發人員提供了一種使他們的應用程序偽同步的方法。

如果這對您來說很陌生,我建議您查看 JavaScript 中的並發模式。 特別是回調和 Promise 鏈。

暫無
暫無

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

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