javascript可以't将视图与数据分离
javascript can't separate view from data
我对javascript回调有些不理解。我想在Java中做一些类似DAO的事情,在那里我操作我的数据,然后调用我的控制器中的DAO对象。但在javascript中,我有这样的东西:
DAO
function DAO() {
this.getData = function(arg1, arg2, callbackSuccess, callbackError) {
var data = null;
// do something to get data. If ok then call callbackSuccess
callbackSuccess(data);
}
var callbackSuccess = function(data) {
// HERE I HAVE THE DATA. HOW TO RETURN IT TO <DATA> ?
}
var callbackError = function(data) {
// ERROR
}
}
在其他我需要获取数据的地方。。。
var dao = new DAO();
var <DATA> = dao.getData(var1, var2, callbackSuccess, callbackError);
我可能可以把回调放在我的控制器中,并将它们发送到getData方法,但这对我来说似乎很奇怪…
您需要了解同步代码和异步代码之间的区别。
在同步代码中,执行的每一条语句都会进行求值,并将结果返回给您。在完成对当前语句的求值之前,不会对其他语句求值。因此,语句总是按顺序进行评估。
var a = syncStatement1();
var b = syncStatement2();
console.log("finished!!!");
在上述代码中,CCD_ 1永远不会在CCD_ 2之前被求值。只有当前面两个函数中的所有代码都已完成时,才会打印日志"finished!!"。
然而,在异步代码中,执行顺序是不同的。当您要求对异步语句进行评估时,执行引擎只需将其安排在稍后的某个时间点进行评估,然后继续执行您的程序。
var a = asyncStatement1();
var b = asyncStatement2();
console.log("finished???");
在上面的第二个示例中,执行引擎不会等待每个语句函数求值后再执行下一个语句。当你到达日志行说"finished???"时,你不能确定之前的函数已经执行完毕。
执行引擎只需安排它们执行,在某个时刻它会执行它们并"返回"它们返回的任何内容,但在最初调用它们时并没有发生这种情况。
这有几个含义,第一个是你不能要求像a = asyncFunc()
这样的异步函数的结果,因为如果函数还没有运行,a
的值应该是多少?。很可能是未定义的,因为目前还没有可用的结果。但是,根据创建异步函数的方式,您可能会返回一个promise对象,您也可以使用它来取消异步操作,或者稍后询问是否有可用的结果。
第二个含义是,由于代码稍后将执行,在您无法控制的上下文中,了解发生了什么的唯一方法是要求函数本身通知您结果,这就是为什么您被迫向异步函数注册回调,如:
function asyncFunc(args, success, error) {
//do something here
if(success) success(data);
}
没有办法绕过这一点,假装代码实际上是在同步模式下运行的。你不得不改变你的思维方式。
正如我在上面所说的,根据您正在使用的框架,您可能会从异步函数中得到一个承诺,并稍微更改一些内容,使其看起来更好,如:
var promise = asynchFunc(args);
promise.success(function(data) {
//do something with data when successful in async.
});
promise.error(function(error){
//handle the error that happened in async.
});
console.log("Most likely not finished yet!!!");
但这仍然是异步执行,当您到达日志时,您很可能还没有处理任何回调。
在处理此类代码时,一些第三方库(如async)可以使您的生活稍微简单一些,以备您需要对其进行一些考虑。
最后,为了解决你的问题,你不能做这个
var dao = new DAO();
var <DATA> = dao.getData(var1, var2, callbackSuccess, callbackError);
但你可以这样做:
var <DATA> = null;
function onSuccess(data){
//act on your data and update controller
<DATA> = data;
}
function onError(error){
//handle error
}
dao.getData(var1, var2, onSuccess, onError);
- 如何在具有某些 UI 视图的状态中管理工厂单个请求数据
- 如何处理数据视图中项目的鼠标点击
- 每隔5秒从数据库获取数据,并通过AJAX将其发送到视图
- AngularJS:点击选项卡刷新视图中的数据
- 如何在angularjs中检查Kendo树视图数据绑定事件
- 将工厂服务数据发送到控制器,以便在视图中使用
- 从Rails视图填充HighChart数据
- 自定义筛选器不'我不使用django数据表视图创建的ajax.data.Json
- 通过jquery将网格视图数据发送到另一个页面
- 清除网络视图数据
- 在这种情况下如何获取部分视图数据
- $_POST 树视图数据
- 如何将视图数据绑定到模型属性
- 将部分视图数据传递给控制器
- 一次将网格视图数据从客户端发送到服务器端
- VueJS和vue-router:使用v-link时,视图数据不会更新
- 用编辑表单替换视图数据
- 隐藏网格视图数据,但仍可访问
- 用部分视图数据asp.net mvc5创建一个弹出窗口
- 如何将html视图数据或(Python)服务器数据传输到Angular或Javascript