javascript可以't将视图与数据分离

javascript can't separate view from data

本文关键字:视图 数据 分离 可以 javascript      更新时间:2023-09-26

我对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);