当前位置:   article > 正文

ExtJs 使用Promise async await_extjs await

extjs await

ExtJs 使用Promise async await

背景:项目中使用了树形菜单,单击叶子节点,弹出对应菜单,把返回的Panel对象放到主面板TabPanel中,实现菜单动态加载;现在遇到这么一个问题,如果我需要加载返回的Panel对象带有grid,并且这个grid的列需要从数据库里去拿;

  1. //点击叶子菜单将会请求Ajax返回一个方法,调用这个方法获取真正的Ext面板对象
  2. function MenuId_Panel(){
  3. //问题是这个这里的column数组是需要从数据库中动态获取
  4. var cm = new Ext.grid.ColumnModel([...]);
  5. var sm = new Ext.grid.RowSelectionModel({
  6. header: "",
  7. singleSelect: true
  8. });
  9. var grid = new Ext.grid.GridPanel({
  10. store: store,
  11. cm: cm,
  12. sm: sm
  13. });
  14. var query_panel = new Ext.Panel({
  15. id: "MenuId_Btn_Panel",
  16. layout: 'fit',
  17. items: [grid]
  18. });
  19. return query_panel;
  20. }
  21. ...
  22. //树形菜单单击事件
  23. function loadPanel() {
  24. var query_panel = MenuId_Panel();//获取返回的Ext面板对象
  25. tabPanel.add(query_panel);//把面板加入到TabPanel中
  26. }

解决方案:

  • 使用Ajax请求获取Column数据,并且增加配置项: async: false;那么上面的代码就会变成:
  1. function MenuId_Panel(){
  2. ...
  3. var cm = null;
  4. Ext.Ajax.request({
  5. async: false, //不使用异步
  6. success: function(res){
  7. //使用同步的方法进行列的动态生成;线程阻塞直到请求完成;才能继续执行下面的代码
  8. cm = new Ext.grid.ColumnModel(...res.responseText...);
  9. }
  10. });
  11. //下面的代码
  12. ...
  13. }

OK,也能解决问题,换成jQuery.ajax也是同样可行;

  • 使用async|await|Promise

1) 首先,创建全局的ExtPromise方法

  1. //全局封装ExtPromise对象
  2. const ExtPromise = (url, params) => {
  3. return new Promise((resovle, reject) => {
  4. Ext.Ajax.request({
  5. url: url,
  6. params: params,
  7. success: res => {
  8. resovle(res);
  9. },
  10. failure: res => {
  11. reject(res);
  12. }
  13. });
  14. });
  15. }

2) 修改MenuId_Panel方法

  1. async function MenuId_Panel(){
  2. ...
  3. var cm = null;
  4. //封装了一下initColumns方法
  5. let initColumns = async() => {
  6. let newCm = await ExtPromise("urlPath", {...yourParams...}).then(res => {
  7. let tmpCm = new Ext.grid.ColumnModel([...res.responseText...])
  8. //需要使用Promise.resolve方法,才能返回tmpCm,否则默认返回Promise对象
  9. return Promise.resolve(tmpCm);
  10. });
  11. return newCm;
  12. }
  13. cm = await initColumns();//当浏览器执行到这一步时会阻塞,直到initColumns返回对象;
  14. //下面的代码
  15. ...
  16. }

3) 当然相应的叶子节点的单机事件也要修改为async,只有在async的方法中,才能使用await;

  1. //树形菜单单击事件
  2. async function loadPanel() {
  3. var query_panel = await MenuId_Panel();//获取返回的Ext面板对象
  4. tabPanel.add(query_panel);//把面板加入到TabPanel中
  5. }

OK.大公告成.

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/322196
推荐阅读
相关标签
  

闽ICP备14008679号