【问题标题】:.done attachment not working with ajax update to file, works with read from file.done 附件不适用于 ajax 更新文件,适用于从文件读取
【发布时间】:2014-11-21 07:36:54
【问题描述】:

将 .done .fail 和 .always 附加到 ajax 调用现在对我来说是可行的 - 当脚本位于 html 页面的底部时,这很“容易”。

现在我想创建通用的 ajax 函数,只需在标头中包含一个 js 文件即可使用。我已经成功使用从服务器读取数据的 ajax 函数(.done 总是有效的)。我只是将数据写入或更新到服务器时遇到问题(不返回数据)。以下是具体内容-

始终有效的标准 ajax 添加/更新调用 - 在页面底部的脚本标签中。

$.ajax({
        type: 'POST',
         url: 'supdateajaxfunctiontestbackend.php',
        data: {localid: localid,
               firstname: firstname,
               lastname: lastname}
        }).done(function(){ alert('Done with Add/Update!'); });

如果我在页面底部创建一个函数,或者将该函数添加到一个 js 文件中,这个添加/更新总是有效的。

function generalWriteAjax(filetocall, datatosend) {
  $.ajax({
          type: 'POST',
           url: filetocall,
          data: datatosend
          }).done(function(){ alert('Done with Add/Update!'); });
                                                   }

我想将 .done 从函数中分离出来,并在附加到单独的函数/对象时调用 .done。当从服务器返回数据时,以下代码可以正常工作。 (请求服务器数据的单独的 generalReadAjax 函数)。完成后附加到从服务器返回的对象(我在 Stackoverflow 上找到了这个概念)。

  backenddata = generalReadAjax('readtesttablebackend.php');
  displayData(backenddata);
  backenddata.done(function(){ alert("Done with read!"); });
                                   });

我已经尝试了以下所有使用 WRITE/UPDATE only 功能的方法,但它们都不起作用。

generalWriteAjax(filetocall4update, datatosend4update).done(function(){ alert('Done function'); });

generalWriteAjax(filetocall4update, datatosend4update).when(function(){ alert('Done function'); });

generalWriteAjax(filetocall4update, datatosend4update).then(function(){ alert('Done function'); });

generalWriteAjax(filetocall4update, datatosend4update);
createdonealert = generalWriteAjax(filetocall4update, datatosend4update);
createdonealert.done(function(){ alert('Done function'); });

createdonealert.when(function(){ alert('Done function'); });

createdonealert.then(function(){ alert('Done function'); });

因此,很明显,“去获取我的数据”和“这是数据,请存储它”之间的承诺处理方式有所不同。

我什至在更新 php 文件的底部放了一个 echo "Done"; 只是为了返回一些东西,但仍然没有运气。

我用以下组合搜索了这个网站和谷歌:

ajax .done attach add update not working promise

并没有发现任何与我的具体示例有关的内容。

谁能给我一些指导?

提前谢谢你。

【问题讨论】:

    标签: ajax sql-update promise


    【解决方案1】:

    好吧,没有人回应,我在最后一天通过破解这个问题学到了一些东西。以下是我认为我学到的一些东西:

    1. 如果您使用 ajax 创建一个通用的可调用函数,它的行为与“内联”ajax 不同 - 当 ajax 代码位于脚本标签之间的 HTML 页面。

    2. 如果您从服务器返回某些内容,则 ajax 函数的行为类似于在脚本标签之间时的行为。

    3. 如果您不从服务器返回数据,则 ajax 函数的行为与内联时不同。

    所以我所做的只是对所有“写入/更新”的 php 文件(不返回数据),我在每个返回少量 json“垃圾”的 php 文件的底部添加了一些代码.有了这个“垃圾”,ajax 函数就像页面底部脚本标记之间的常规 ajax 调用一样。

    这是一个组合,但它有效。这是读取/更新 php 文件底部的代码,通常不会返回任何内容。它现在返回一个关于“John”的 json 数组:

       $json = array('firstname' => 'John');
       echo json_encode($json);
    

    这是附件js文件中的函数:

    function generalWriteAjax( filetocall, datatosend ) {
      return $.ajax({
                       type: 'POST',
                        url: filetocall,
                       data: datatosend,
                   dataType: 'json'
                     });
                                                         }
    

    下面是页面上调用.js函数的代码:

    $("#clicktoupdate").click(function(e) {
    var localid = $('#idnumber').val();
    var firstname = $('#updatefirstname').val();
    var lastname = $('#updatelastname').val();
    var filetocall4update = 'supdateajaxfunctiontestbackend.php';
    var datatosend4update = {localid: localid, firstname: firstname, lastname: lastname};
    
    generalWriteAjax(filetocall4update, datatosend4update).done(function(){ alert('Done inline'); });
    
    });//end of update click
    

    我希望我能理解细节,但这是一个有效的经验解决方案。

    专家的意见会很好。

    感谢收看!

    【讨论】:

    • 你在这里所做的看起来是正确的。这正是我编写广义效用函数的方式。它起作用的原因是因为generalWriteAjax() 现在返回由$.ajax() 返回的对象,这是与promise 兼容的。因此,您可以以与最初链接 $.ajax().done() 相同的方式链接 generalWriteAjax().done()
    • 很好,非常感谢。但我想知道“回调”。当函数与其余代码位于同一页面时,将发生回调。但是当我将函数移动到 js 文件时,只有在文件底部放置 echo "blah blah" 时才会从服务器收到回调。
    • 蒂姆,如果我理解正确的话,这与 javascript“成员”的范围有关,而不是与延迟/承诺有关。该函数必须在范围内才能被调用。 Javascript 范围在许多在线教程中都有很好的讨论,这些教程很容易通过您最喜欢的搜索引擎发现。
    • 谢谢!我马上开始找!在 Mozilla 网站上找到一篇不错的评论 - 学习...学习...学习...再次感谢。
    猜你喜欢
    • 2015-03-31
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-18
    相关资源
    最近更新 更多