簡體   English   中英

如何使用 async-await 使部分代碼等到另一部分完成

[英]How to make parts of a code wait until another part has completed using async-await

我需要先完成 function 調用的一部分,然后再完成它的 rest 調用。 目標是我需要注冊/記錄流程的第一部分運行多長時間以用於報告目的。

在下面的代碼中,第一個var data使用輸入參數X2,Y2,Z2運行以在數據庫中查找相應的值。 var api被自動觸發並記錄開始時間。

然后我需要var data來完成,然后運行var api2來注冊完成時間。 這將在可接受的准確度范圍內為我提供“var 數據”的大致運行時間。

有誰知道我該怎么做?

function Searh_09() {
   var data = {
     'X': document.id('X2').value,
     'Y': document.id('Y2').value,
     'Z': document.id('Z2').value,
     'Transform': 'Templates/Report/Standard.xslt'
   }; 

   if (!X)
      return;

   if (!Y)
      return;

   if (!Z)
       return;

   var api = new qbo3.ProcessObject();
   api.invokeJson('StartTime',data);

   var api2 = new qbo3.ProcessObject();
   api2.invokeJson('EndTime');
}

您在評論中提供的鏈接提供了對此invokeJson操作的一些見解。 特別是這里的這一點:

invokeJson(method, data, { success: resolve, error: reject })

第三個方法參數上的那些successerror屬性是回調。 與常見的 jQuery AJAX 實現類似,它們本質上是您創建函數的地方,這些函數將在稍后操作完成(或失敗)時調用。

由於您的代碼正在調用其中兩個操作,因此您實際上可以調試三個“時刻”。 第一次手術前,兩次手術之間,第二次手術后。 使用您擁有的工具可能看起來像這樣:

console.log('Before first operation.');
var api = new qbo3.ProcessObject();
api.invokeJson('StartTime', data, {
  success: function () {
    console.log('Between the operations.');
    var api2 = new qbo3.ProcessObject();
    api2.invokeJson('EndTime', null, {
      success: function () {
        console.log('After second operation.');
      }
    });
  }
});

如您所見,對invokeJson()的每次調用都包含一個帶有success回調function 的第三個參數,它將在異步操作完成后調用。


現在,針對您的問題,具體來說:

如何使用 async-await使部分代碼等到另一部分完成

您正在使用的庫似乎沒有使用 async/await。 但是, 您在評論中鏈接的答案顯示了如何解決這個問題。 您可以將操作包裝在Promise中,其結構包括resolvereject函數,它們的作用與successerror回調的作用完全相同

稍微修改該答案中的代碼,您可以創建一個 function ,它接受您的api對象之一並在 invokeJson 周圍返回invokeJson 也許是這樣的:

async function invokeJsonAsync(api, str, data) {
  return new Promise(function (resolve, reject) {
    api.invokeJson(str, data, { success: resolve, error: reject });
  });
}

現在不是直接在api對象上調用invokeJson ,而是將它們傳遞給這個 function 並await返回的Promise

var api = new qbo3.ProcessObject();
await invokeJsonAsync(api, 'StartTime', data);

var api2 = new qbo3.ProcessObject();
await invokeJsonAsync(api2, 'EndTime');

請注意,您還需要在Searh_09 function 定義中使用async關鍵字,以便在該 function 中使用await

鏈接的答案更進一步,使這個 function 成為api對象本身的一部分。 如果您希望經常使用它,那會更干凈。 程序員似乎這樣做是為了使用.then()將這些調用鏈接在一起。 使用await具有相同的效果,這正是您所要求的。


總的來說,值得理解的是,這並不是“讓部分代碼等到其他部分完成”。 默認情況下,代碼會這樣做。 它強制逐行執行,直到完成。

然而,現在代碼調用的一些操作是異步的。 這意味着執行該操作的上下文被卸載到正在運行的代碼之外的另一個進程。 正在運行的代碼將繼續執行更多語句。 稍后,當該異步過程完成時,它會將控制權轉移回此代碼以進行任何潛在的后續操作。

由於 JavaScript 是單線程的,因此這些異步操作的任何后續操作都將在所有命令式代碼語句都執行后發生。 后來被調用的后續操作就是這些回調函數。 (因此得名......它是一個 function,當控件返回到代碼時將被調用。另一個進程正在使用這個 function 來“給我們回電”。)

asyncawait只是用更簡潔的語法包裝它。 但最終“等待”的是具有回調函數的Promise 當您使用await時,您基本上是在告訴代碼當前 function 中此語句之后的所有內容都是回調。

暫無
暫無

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

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