CAP和ASYNC/AWAIT

2020-08-14 15:01发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这里的基本问题。 我很难尝试实现schema.js文件。 问题是,当我尝试使用某些异步功能(例如" await cds.read"或" SELECT.from ...")或任何异步功能时,我无法设法使其正常运行。 处理程序结束,并且只有在解决了Promise并且响应已经消失之后," await cds.read"运行之后的每个逻辑(我告诉过您这是一个基本问题)。

所以我从我们的好朋友DJ Adams找到了一个不错的博客:

https://blogs.sap.com/2019/08/21/computed-field-example-in-cap/comment-page-1

(我在此处发表评论)

DJ向我们展示了一个使我想做的事情的示例:实现后读取处理程序以进行异步调用(等待cds.transaction(req).run(SELECT .from(Books)...)并更改最终 响应基于此异步选择的结果,因此我实现了它,但正在发生奇怪的事情。奇怪的是,有时它填充了numberOfBooks属性,但大多数情况下却没有。我一直按一下刷新按钮, 有关更改结果的信息,以下是两个响应,一个接一个,没有重置或更改任何内容:

  {
 @ odata.context:" $ metadata#Authors",
 值:[
 {
 ID:101,
 名称:"艾米莉·布朗特",
 书数:1
 },
 {
 ID:107,
 名称:"夏洛特·勃朗特",
 numberOfBooks:null
 },
 {
 ID:150,
 名称:"埃德加·艾伦·坡(Edgar Allen Poe)",
 书数:2
 },
 {
 ID:170,
 名称:"理查德·卡彭特",
 numberOfBooks:null
 }
 ]
 } 

(点击刷新...)

  {
 @ odata.context:" $ metadata#Authors",
 值:[
 {
 ID:101,
 名称:"艾米莉·布朗特",
 numberOfBooks:null
 },
 {
 ID:107,
 名称:"夏洛特·勃朗特",
 numberOfBooks:null
 },
 {
 ID:150,
 名称:"埃德加·艾伦·坡(Edgar Allen Poe)",
 numberOfBooks:null
 },
 {
 ID:170,
 名称:"理查德·卡彭特",
 numberOfBooks:null
 }
 ]
 } 

您看到了吗? 埃德加·爱伦·坡(Edgar Allan Poe)第二次拥有2本书,却没有。 艾米丽只有一个,现在却没有。 其他人甚至没有第一次出现。 有时我会为所有这些人买书,有时会为一些人买书,但大多数时候却没有。 Straaaange…。

我非常怀疑这与我上面描述的异步/等待问题相同。

尽管我的安装存在一些问题(VSCode,nodejs,谁知道...),所以我在SAP Business Application Studio上进行了尝试,但结果却完全相同。 这样可以排除一些过时的软件包或其他软件包。

其他人看到过类似的东西吗?

您可以在这里找到我的代码:

https://github.com/ecassaro1/ws1/tree/master/p15

有什么建议吗?

我很确定我缺少一些非常基本的内容...

预先感谢,埃里克

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


这里的基本问题。 我很难尝试实现schema.js文件。 问题是,当我尝试使用某些异步功能(例如" await cds.read"或" SELECT.from ...")或任何异步功能时,我无法设法使其正常运行。 处理程序结束,并且只有在解决了Promise并且响应已经消失之后," await cds.read"运行之后的每个逻辑(我告诉过您这是一个基本问题)。

所以我从我们的好朋友DJ Adams找到了一个不错的博客:

https://blogs.sap.com/2019/08/21/computed-field-example-in-cap/comment-page-1

(我在此处发表评论)

DJ向我们展示了一个使我想做的事情的示例:实现后读取处理程序以进行异步调用(等待cds.transaction(req).run(SELECT .from(Books)...)并更改最终 响应基于此异步选择的结果,因此我实现了它,但正在发生奇怪的事情。奇怪的是,有时它填充了numberOfBooks属性,但大多数情况下却没有。我一直按一下刷新按钮, 有关更改结果的信息,以下是两个响应,一个接一个,没有重置或更改任何内容:

  {
 @ odata.context:" $ metadata#Authors",
 值:[
 {
 ID:101,
 名称:"艾米莉·布朗特",
 书数:1
 },
 {
 ID:107,
 名称:"夏洛特·勃朗特",
 numberOfBooks:null
 },
 {
 ID:150,
 名称:"埃德加·艾伦·坡(Edgar Allen Poe)",
 书数:2
 },
 {
 ID:170,
 名称:"理查德·卡彭特",
 numberOfBooks:null
 }
 ]
 } 

(点击刷新...)

  {
 @ odata.context:" $ metadata#Authors",
 值:[
 {
 ID:101,
 名称:"艾米莉·布朗特",
 numberOfBooks:null
 },
 {
 ID:107,
 名称:"夏洛特·勃朗特",
 numberOfBooks:null
 },
 {
 ID:150,
 名称:"埃德加·艾伦·坡(Edgar Allen Poe)",
 numberOfBooks:null
 },
 {
 ID:170,
 名称:"理查德·卡彭特",
 numberOfBooks:null
 }
 ]
 } 

您看到了吗? 埃德加·爱伦·坡(Edgar Allan Poe)第二次拥有2本书,却没有。 艾米丽只有一个,现在却没有。 其他人甚至没有第一次出现。 有时我会为所有这些人买书,有时会为一些人买书,但大多数时候却没有。 Straaaange…。

我非常怀疑这与我上面描述的异步/等待问题相同。

尽管我的安装存在一些问题(VSCode,nodejs,谁知道...),所以我在SAP Business Application Studio上进行了尝试,但结果却完全相同。 这样可以排除一些过时的软件包或其他软件包。

其他人看到过类似的东西吗?

您可以在这里找到我的代码:

https://github.com/ecassaro1/ws1/tree/master/p15

有什么建议吗?

我很确定我缺少一些非常基本的内容...

预先感谢,埃里克

付费偷看设置
发送
2条回答
95年老男孩
1楼 · 2020-08-14 15:12.采纳回答

Eric,你好

您必须将对Array.prototype.map()函数的调用包装到Promise.all()调用中:

 module.exports = srv => {

   const {书籍} = srv.entities

   srv.after('READ','Authors',(authors,req)=> {
     返回Promise.all(authors.map(async author => {
       const publications =等待cds.transaction(req).run(
         SELECT.from(Books).where({author_ID:author.ID})
       )
       author.numberOfBooks = publications.length
     }));
   });
 } 

在此处查看说明: https://flaviocopes.com/javascript-async- await-array-map/

亲切的问候,

塞巴斯蒂安

绿领巾童鞋
2楼-- · 2020-08-14 15:19

嗨,埃里克,

https://cap.cloud.sap/docs/node。 js/api#service-after 指出"仅允许同步修改。也就是说,不可能像下面两个示例中那样进行替换和异步修改"。 解决方案是"为了替换/异步修改结果,请在 on 处理程序上使用"。

文档还解释了原因,为什么后期处理程序会受到这种限制。

亲切的问候,

塞巴斯蒂安

一周热门 更多>