我们将顶点从3.2升级到5.1.1。我们在jquery中使用函数htmldb_get。但是在最新版本中,oracle不支持这个功能。现在我们尝试用apex.server.process(oracle推荐)重写相同的内容。有人可以就如何改写下面的陈述提出建议吗?
var a=new htmldb_Get(null,&APP_ID.,"APPLICATION_PROCESS=DUMMY",&APP_PAGE_ID.);
htmldb_Get.get
是一个同步api。这意味着当您调用get()
时,您将掌握结果并且以下代码可以访问该结果。新的api是异步的。结果将被获取但可能立即可用或不可用。这是人们在迁移到这个新api时最常犯的错误。
您没有发布更多代码,但请注意这很重要。现在你只发布了如何设置htmlDb_Get
对象。你还没有打电话给get
。
例如,假设代码如下所示:
var a=new htmldb_Get(null,&APP_ID.,"APPLICATION_PROCESS=DUMMY",&APP_PAGE_ID.);
var result = a.get();
var result2 = doSomethingWithResult(result);
...
$s('Px_ITEM1', result2);
用.get()
“简单地”取代apex.server.process
是不够的。它不会以这种方式映射或工作。您必须考虑到返回结果可能需要一段时间。 API(以及ajax如何运行)只是实例化一个调用,该调用在将来的某个时刻返回结果。与同步调用(也阻止浏览器的UI)不同,它不会阻止代码(=线程)。因此,如果您更换上述内容并立即调用与结果相关的代码,假设结果存在,则会导致您头疼的时刻如下:“有时它会存在,有时它不存在 - 发生了什么?”。
因此,在apex.server.process上提示“done”函数,该函数在调用完成时执行(=已从服务器返回结果)。
apex.server.process("SOME_PROCESS").done(function(pData){
var result2 = doSomethingWithResult(pData);
$s('Px_ITEM1', result2);
});
不是这样的:
apex.server.process("SOME_PROCESS").done(function(pData){
var result = pData;
});
var result2 = doSomethingWithResult(pData);
$s('Px_ITEM1', result2);
另外,请注意,默认情况下,apex.server.process需要返回JSON字符串。不这样做会导致弹出错误。如果您不想在调用的进程中更改返回值,则可以将预期的数据类型更改为text:
apex.server.process("SOME_PROCESS", {}, {dataType:"text"})