使用Ajax回调的Javascript模块模式
我写了一个网站,其中有几个类别,必须从mongo数据库中提取数据。 到目前为止,我已经编写了计划ajax调用,但由于这个要求需要我继续使用相同的ajax调用各种各样的东西,我已经开始考虑可重用的代码/模式。 我是Javascript模块模式的新手,但到目前为止,我阅读和理解的内容,看起来像Revealing模块模式对我来说可能是一个良好的开端,而不是与其他面向对象的东西混淆太多。
我知道在SOF和互联网上有很多链接,文档可用,但我真的无法直接回答我的简单要求,以便我将其提升到一个理解的新水平。
我在这里写了一个测试代码……
var myApp = new function () { var Var1 = []; getData = function (sendData) { return $.ajax({ type: "POST", url: URL, data: sendData, datatype: "json", success: function (results) {} }); }; getOffers = function (sendData) { getData(sendData); }; return { getOffers: getOffers }; }();
如我所知,getData保持私有以从数据库中提取记录,getOffers是公共的,从外部调用。 但是,我如何在他们之外获得我的ajax呼叫的成功回报?
我想要实现的是一种简单的方法来调用我的函数,如下所示。
myApp.getOffers({ 'showData': 1, 'myLocation': "Location1", 'clientID': "Client1" }); myApp.getOffers({ 'showData': 1, 'myLocation': "Location2", 'clientID': "Client2" });
从我的mongodb获取数据,以便我可以根据我的要求改变它们。 当它们返回值时,我会操纵它们在diff Div中显示它们,以便动作需要超出我的定义,因为它们不是静态的。
我是如何实现它的,因为当我直接从函数返回一些内容时它可以工作但是当它必须从ajax返回时它不会由于我必须编写的回调。 但这是如何编写的,以便我们可以重用代码并用最简单的方法改变发送各种字段?
请更改此代码,以便我更好地理解它,并从一些非常基本的东西开始,以满足我的要求。 或者发给我一些真正解释我基本知识的链接。
另外,我坚持使用myApp的ajax“POST”方法,原因我认为当使用“GET”方法时,用户知道我传递的变量(来自其源代码)可以直接将它们作为action.php发送?变量= 1&变量= 2。 如果我可以安全地使用GET方法,我该如何避免它?
但是,我如何在他们之外获得我的ajax呼叫的成功回报?
让getOffers
返回jqXHR getData
返回如下 –
var myApp = (function () { var Var1 = []; var getData = function (sendData) { return $.ajax({ type: "POST", url: URL, data: sendData, datatype: "json", success: function (results) {} }); }; var getOffers = function (sendData) { // return the jqXHR returned by getData return getData(sendData); }; return { getOffers: getOffers }; })();
$.ajax({})
返回的jqXHR
对象是一个Promise
– 当你获得Ajax请求的成功响应时 – 你可以附加一个这样的成功处理程序 – 在你的ajax请求之外
myApp.getOffers({ 'showData': 1, 'myLocation': "Location1", 'clientID': "Client1" }).done(function (data, textStatus, jqXHR) { // work with DOM here });
更多关于Jquery Deferreds / Promises的信息 –
此外,您在声明期间通过在前面缺少var
来创建getData
, getOffers
全局。
根据你对使用POST
而不是GET
评论,一般的经验法则是GET
用于检索数据,POST用于保存 – 只是因为你使用POST
并不意味着某些人无法嗅探你发送的数据,它只是请求正文的一部分而不是请求URL。 如果您认为发送的数据非常敏感,则应考虑为您的应用启用SSL(HTTPS)
。