我有这个异步函数:
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)
}
我该怎么做?
异步函数意味着在单独的线程上运行,因此您的应用程序在等待结果并行生效时不会停止运行。
任何异步(包括脚本/模块的根)都将与并发线程并行运行。每个都有自己的私有、共享和全局上下文。但是在该异步块内运行的代码在该上下文中是同步的。
因此,在您的特定情况下,您只需要
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;
}