0

如何在 Javascript 中将 qbo3 API 调用链接Promise ?

我试图让下面的 JavaScript 在点击完成后var api暂停var data。然后完成后,该功能可以照常进行。总体目标是获得大约。测量通过函数调用调用查询后运行多长时间。

var data = {...};
var api1 = new qbo3.ProcessObject();
api1.invokeJson('StartRecordingTime',data);                                             

var api2 = new qbo3.ProcessObject({target: 'row_4'});
api2.invokeHtml('RealWorldApiCall', data);

var api3 = new qbo3.ProcessObject();
api3.invokeJson('EndRecordingTime');
4

1 回答 1

0

您可以基于 qbo3 API 调用构造一个 Promise,如下所示:

qbo3.getPromise = function(cn, method, data) {
  return new Promise(function(resolve, reject) {
    new (qbo3[cn] || qbo3[cn + 'Object'])().invokeJson(method, data, { success: resolve, error: reject });
  })
}

在哪里:

  • cn: 是 API 端点的类名(例如Process, Loan, Person, Message, 等)
  • method: 是要调用的类方法(例如Select, Search, Update, 等)
  • data: 是JSON要提交的数据

(qbo3[cn] || qbo3[cn + 'Object'])表达式只是一点糖,允许您将或Process作为ProcessObject参数cn传递给qbo3.getPromise(...).

然后你可以使用:

var data = {...}
var myPromise = qbo3.getPromise('Process', 'StartRecordingTime', data)
  .then(return qbo3.getPromise('Process', 'RealWorldApiCall', data))
  .then(return qbo3.getPromise('Process', 'EndRecordingTime', {}))

更通用的用法是利用一个 API 的结果将数据传递给后续调用:

var somePromise = qbo3.getPromise('Person', 'Search', {"Person": "someuser@acme.com"})
  .then(json => {
    const id = json.PersonCollection.PersonItem[0].PersonID;
    return qbo3.getPromise('ProcessObject', 'Search', { "CreatedPersonID": id })
  }).then(processes => console.log(processes));

请注意,如果您只是对响应时间进行故障排除,请在所有 API 调用中qbo3包含响应标头。X-Execution-Time此标头不会传递给resolve方法,您可以从 Chrome 的开发人员控制台的Network表格中检查它,如下图所示:

在此处输入图像描述

于 2021-04-07T22:12:28.323 回答