同步获取异步数据

问题描述 投票:0回答:1

我有这个异步函数:

async function getAndCleanBatchMap() {
    const unlock = await lock.acquire(); // Wait for the lock
    try {
        let currentBatchMap = new Map(batchMap); // Store a copy of the current batchMap
        batchMap = new Map(); // Reset batchMap to a new empty Map
        return currentBatchMap; // Return the old batchMap
    } finally {
        unlock(); // Release the lock
    }
}

这将返回一个承诺。 通常您将使用 .then 并处理那里的数据,但就我而言,该脚本在 selenium 浏览器中运行,我需要从中获取 currentBatchMap 实际值而不是承诺,以便然后将其断言键入等效项戈兰。

问题是 .then 在这种情况下不能使用,因为我需要一种方法来实际返回原始值而不是承诺,通常是这样的:

value, err := wd.ExecuteScript("return getData()", nil)
            if err != nil {
                log.Fatal("Error accessing global variable:", err)
            }

我该怎么做?

javascript async-await
1个回答
0
投票

异步函数意味着在单独的线程上运行,因此您的应用程序在等待结果并行生效时不会停止运行。

任何异步(包括脚本/模块的根)都将与并发线程并行运行。每个都有自己的私有、共享和全局上下文。但是在该异步块内运行的代码在该上下文中是同步的。

因此,在您的特定情况下,您只需要

await
.then()
您的
getAndCleanBatchMap()
函数调用...

// script root
const trueValue = await getAndCleanBatchMap();

但是,请注意,你也可以有这样的东西......

// script root
const value = getAndCleanBatchMap(); // async context and async call

function doSomething () // sync context
{
   // Here, value can be a Promise or the raw value,
   // because Promises replace themselves with the
   // resolved value when fulfilled at async context.
   
   if ( ! ( value instanceof Promise ) )
   {
      // Do anything you want here because raw value
      // is ready.
      
      return value;
   }
   
   // Now you can only resort to mock the result,
   // because the raw value is not ready yet.
   const mockedResult = Object.create
   ({
      fake: 'data',
   });
   
   Promise.then
   (
      // This will resolve after the raw value is ready and replace
      // the mocked result prototype which contains the fake data.
      value => Object.setPrototypeOf(mockedResult, value)
   );
   
   // You release your mocked result that will be replaced with the
   // raw value when ready.
   return mockedResult;
}
© www.soinside.com 2019 - 2024. All rights reserved.