如何在javascript中等待this.submit()函数完成

如何在javascript中等待this.submit()函数完成,javascript,jquery,datatables,Javascript,Jquery,Datatables,编辑 在Rory McCrossan的指示后,我更改了代码以获得以下信息: var backNext = [ { text: "<", action: function (e) { this.submit( function () { }, null, null, false ); table.on( 'draw', function () {

编辑

在Rory McCrossan的指示后,我更改了代码以获得以下信息:

var backNext = [
    {
        text: "<",
        action: function (e) {

            this.submit( function () {

            }, null, null, false );

            table.on( 'draw', function () {
                var indexes = table.rows( {search: 'applied'} ).indexes();
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );                         

                if ( currentPosition > 0 ) {
                    var prev;
                    for (let i = currentPosition; i > 0; i--){
                        if(table.row(i-1).data()["Date"] === ""){
                            prev = i-1;
                            break;
                        }
                    }
                    if(prev !== undefined){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ prev ] ).select();
                    }
                }

                // Trigger editing through the button
                table.button( 0 ).trigger();
            });        
        }
    },
    'Enregistrer',
    {
        text: ">",
        action: function (e) {

            this.submit( function() {

            }, null, null, false );

            table.on( 'draw', function () {
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );
                var indexes = table.rows( {search: 'applied'} ).indexes();

                if ( currentPosition < indexes.length-1 ) {
                    var next = 0;
                    for (let i = currentPosition; i < indexes.length-1; i++){
                        if(table.row(i+1).data()["Date"] === ""){
                            next = i+1;
                            break;
                        }
                    }
                    if (next !== 0){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ next ] ).select();
                    }
                }

                // Trigger editing through the button
                table.button( 0 ).trigger();
            });
        }
    }
];
当我通过提供以下数据编辑第一行时:
{'Name':'Books','Qty':6,'Expiration Date':11/2022}
。行数将更改:

| No. | Name  | Qty | Expiration Date | Balance |

  1     Books   4      ""                4
  2     Books   6      11/2022           0
  3     Pens    5      ""                5
以下是我的代码结构:

// Buttons array definition to create previous, save and next buttons in
// an Editor form
var backNext = [
    {
        text: "&lt;",
        action: function (e) {
            // On submit, find the currently selected row and select the previous one
            this.submit( function () {
            }).done( function (){
                var indexes = table.rows( {search: 'applied'} ).indexes();
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );

                if ( currentPosition > 0 ) {
                    var prev;
                    for (let i = currentPosition; i > 0; i--){
                        if(table.row(i-1).data()["Date"] === ""){
                            prev = i-1;
                            break;
                        }
                    }
                    if(prev !== undefined){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ prev ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            });
        }
    },
    'Save',
    {
        text: "&gt;",
        action: function (e) {
            this.submit( function() {

            }).done( function (){
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = this.indexes.indexOf( currentIndex );
                var indexes = table.rows( {search: 'applied'} ).indexes();

                if ( currentPosition < indexes.length-1 ) {
                    var next = 0;
                    for (let i = currentPosition; i < indexes.length-1; i++){
                        if(table.row(i+1).data()["Date"] === ""){
                            next = i+1;
                            break;
                        }
                    }
                    if (next !== 0){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ next ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            }); 
        }
    }
];
//在中创建上一个、保存和下一个按钮的按钮数组定义
//编辑表格
var backNext=[
{
正文:“,
行动:职能(e){
//提交时,找到当前选定的行并选择上一行
这个。提交(函数(){
}).done(函数(){
var index=table.rows({search:'applied'}).index();
var currentIndex=table.row({selected:true}).index();
var currentPosition=索引.indexOf(currentIndex);
如果(当前位置>0){
var-prev;
对于(设i=currentPosition;i>0;i--){
if(表行(i-1).data()[“日期”]=“”){
prev=i-1;
打破
}
}
如果(上一个!==未定义){
table.row(currentIndex).deselect();
table.row(索引[prev]).select();
}
}
//通过按钮触发编辑
table.button(0.trigger();
});
}
},
“保存”,
{
正文:“,
行动:职能(e){
this.submit(函数(){
}).done(函数(){
var currentIndex=table.row({selected:true}).index();
var currentPosition=this.index.indexOf(currentIndex);
var index=table.rows({search:'applied'}).index();
如果(当前位置
代码应该做什么:

当我按下
next
previous
按钮时,我必须转到下一行/上一行,,但只有当到期日期为空时才可以

在上面的示例中,编辑第1行后,
next
按钮必须跳过第二行,将我带到第三行

现在的问题是Ajax是异步的,这意味着使用datatables站点上提供的示例,索引和当前位置的恢复只考虑表的先前结构。新行未被考虑在内。这就是为什么我添加了
done
方法,以等待ajax请求完成并重新绘制表,从而检索索引和当前位置

但是我的代码不能正常工作。我得到错误
未捕获类型错误:this.submit(…).done不是一个函数


如何解决这个问题?

submit()
不是一个异步方法,因此
done()
是不相关的(正如错误所暗示的)。如果要在数据更新时对datatable执行某些逻辑,则需要向其添加事件侦听器。对于你的情况,我建议
draw
。非常感谢你,我刚刚调整了我的代码,效果非常好。但是我对这一行有点问题:
var currentPosition=index.indexOf(currentdex)。这一行给出了错误:
uncaughttypeerror:无法读取未定义的
的属性'indexOf'。我不是javascript专家,但我觉得这与以下事实有关:此代码不是在
this
的上下文中执行的。你能给我看看解决这个问题的方法吗?
// Buttons array definition to create previous, save and next buttons in
// an Editor form
var backNext = [
    {
        text: "&lt;",
        action: function (e) {
            // On submit, find the currently selected row and select the previous one
            this.submit( function () {
            }).done( function (){
                var indexes = table.rows( {search: 'applied'} ).indexes();
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = indexes.indexOf( currentIndex );

                if ( currentPosition > 0 ) {
                    var prev;
                    for (let i = currentPosition; i > 0; i--){
                        if(table.row(i-1).data()["Date"] === ""){
                            prev = i-1;
                            break;
                        }
                    }
                    if(prev !== undefined){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ prev ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            });
        }
    },
    'Save',
    {
        text: "&gt;",
        action: function (e) {
            this.submit( function() {

            }).done( function (){
                var currentIndex = table.row( {selected: true} ).index();
                var currentPosition = this.indexes.indexOf( currentIndex );
                var indexes = table.rows( {search: 'applied'} ).indexes();

                if ( currentPosition < indexes.length-1 ) {
                    var next = 0;
                    for (let i = currentPosition; i < indexes.length-1; i++){
                        if(table.row(i+1).data()["Date"] === ""){
                            next = i+1;
                            break;
                        }
                    }
                    if (next !== 0){
                        table.row( currentIndex ).deselect();
                        table.row( indexes[ next ] ).select();
                    }
                }
                // Trigger editing through the button
                table.button( 0 ).trigger();
            }); 
        }
    }
];