UI5 Messagebox synchron

时间:2016-08-04 13:58:34

标签: sapui5 messagebox

嗨我在for循环中实现了一个Messagebox,但我知道messagebox工作异步。 我希望程序等待每个循环到用户的desicion。

onBook: function(oEvent) {
  var that = this;
  for (var i = 0; i < Items.length; i++){

      function message(innerArg) {
        sap.m.MessageBox.confirm(
                "Text", {
                  icon : sap.m.MessageBox.Icon.INFORMATION,
                  title : "Really",
                  actions : [ sap.m.MessageBox.Action.YES,
                      sap.m.MessageBox.Action.NO ],
                  onClose : function(oAction) {
                    if (oAction === sap.m.MessageBox.Action.NO) {
                     delete(i);
                    }else{

                    }
                  }
                });
        }

        message(i);

  }
 that.do(oEvent); 

程序跳进&#34;做&#34;用户操作完成前的方法

编辑:

      for (var i = 0; i < Items.length; i++){

      (function (innerArg) {
        sap.m.MessageBox.confirm(
                "Delete?", {
                  icon : sap.m.MessageBox.Icon.INFORMATION,
                  title : "Delete",
                  actions : [ sap.m.MessageBox.Action.YES,
                      sap.m.MessageBox.Action.NO ],
                  onClose : function(oAction) {
                    if (oAction === sap.m.MessageBox.Action.NO) {
                     delete(innerArg)
                  }}
                });
        })(i);   

  }
 that.Save(oEvent);

当框打开时,条目被预订,因为程序进入保存方法而没有用户操作的错误什么是错的?

1 个答案:

答案 0 :(得分:0)

啊,异步函数在同步循环反模式中; - )

您可以尝试使用闭包:

for (var i = 0; i < items; i++) {
    // use self-executing function here
    (function(innerArg) {
        sap.m.MessageBox.confirm(
            "Text", {
                onClose: function(oAction) {
                    if (oAction === sap.m.MessageBox.Action.NO) {
                        // here I want to do something
                        console.log("Value: ", innerArg);                        
                    }
                }
            }
        );
    })(i);
}

编辑:使用Promises更新

根据您更新的问题,我提供了一个或多或少的有点工作示例(它可能无法完美运行,但它应该显示您应该遵循的设计模式)

将消息框响应包装到Promise解析中,并将它们存储到数组中。然后,您将该数组提供给Promise.all()以继续保存功能

processData: function() {
    var promises = [],
        self     = this;

    for (var i = 0; i < items; i++) {
        promises.push(this.doMessageboxAction(i));
    }

    Promise.all(promises).then(function(aData) {
        aData.forEach(function(oData) {
            self.save(oData);
        });
    }).catch(function(err) {
        console.log(err);
    });
}

doMessageboxAction: function(item) {
    return new Promise(function(resolve, reject) {
        sap.m.MessageBox.confirm(
            "Text", {
                onClose: function(oAction) {
                    if (oAction === sap.m.MessageBox.Action.NO) {
                        //do something
                        //etc
                        resolve(item); // or some other variable
                    }
                    else {
                        //do something else
                        //etc
                        resolve(item); // or some other variable
                    }
                }
            }
        );
    });
}