如何使用异步等待使代码的部分等待,直到另一部分完成



我需要先完成函数调用的一部分,然后再恢复其余部分。目标是为了报告目的,我需要注册/记录流程的第一部分运行的时间。

在下面的代码中,第一个var data使用输入参数X2,Y2,Z2运行,以在数据库中找到相应的值。CCD_ 3被自动触发并记录开始时间。

然后我需要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属性是回调。与常见的jQueryAJAX实现类似,它们本质上是您创建函数的地方,这些函数将在稍后操作完成(或失败(时调用。

由于您的代码正在调用其中的2个操作,因此您实际上有三个";"时刻";您可以调试。在第一次操作之前,在两次操作之间,以及在第二次操作之后。使用您拥有的工具可能看起来像这样:

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回调函数的第三个参数,该函数将在异步操作完成后调用。


现在,针对您的问题,特别是:

如何使用异步等待使代码的一部分等待另一部分完成

您使用的库似乎没有使用async/await。然而,你在评论中链接到的答案表明了如何绕过这一点。您可以将操作封装在Promise中,CCD_11的结构包括resolvereject函数,它们的作用与successerror回调的作用完全相同

稍微修改一下答案中的代码,就可以创建一个函数,它接受一个api对象,并返回一个关于invokeJson的promise。也许是这样的:

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

现在,您不需要直接在api对象上调用invokeJson,而是将它们传递给该函数,并将返回的Promise:传递给await

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

请注意,您还需要在Searh_09函数定义中使用async关键字,以便在该函数中使用CCD24。

链接的答案使这个函数成为api对象本身的一部分,从而使它更进一步。如果你想经常使用这个,哪个会更干净。程序员这样做的目的似乎是使用.then()将这些调用链接在一起。使用await也有同样的效果,这正是你所要求的。


总的来说,值得理解的是;使得代码的部分等待直到其他部分完成";。默认情况下,代码会执行此操作。它强制性地逐行执行,直到完成为止。

然而,目前代码调用的一些操作是异步。这意味着执行该操作的上下文被卸载到正在运行的代码外部的另一个进程。正在运行的代码将继续执行更多的语句。稍后,当异步进程完成时,它将把控制权转移回该代码,以进行任何潜在的后续操作。

由于JavaScript是单线程的,对这些异步操作的任何后续操作都将在执行完所有命令式代码语句之后进行。随后调用的后续操作是这些回调函数。(因此得名……这是一个当控件返回到代码时将调用的函数。另一个进程使用此函数"回调我们"。(

CCD_ 28和CCD_。但最终;等待";是具有回调功能的CCD_ 30。当您使用var api1时,您基本上是在告诉代码,当前函数中该语句之后的所有内容都是回调。

最新更新