当前位置: 首页 > 知识库问答 >
问题:

AngularJS:为什么即使它们显示正确,我也会因此得到NaN?

谭安翔
2023-03-14

编辑:修复//。。。和//下面代码中的错误注释显示了答案

对于JavaScript专家来说,这可能是一件愚蠢而显而易见的事情。。。但如果我能知道这是怎么回事,我会很生气的。

这是我的t.js:

var angularApp = angular.module('myApp', []);

angularApp.controller('mainController', ['$scope', '$http', '$log',
                                function ($scope,   $http,   $log) {
    $scope.version = angular.version;
    var ctime = new Date();
    $scope.ctime = ctime.getTime() / 1000;
    $http.get('http://127.0.0.1:8765/').then(
      function(res){
        $scope.stime = res['data']['server-time'] / 1000;
        // Fix goes here: $scope.skew = $scope.stime - $scope.ctime;
        },
      function(error){
        $log.warn('Unable to get time');});
    // Error here: this happens asynchronously to the $http.get!
    $scope.skew = parseFloat($scope.stime) - parseFloat($scope.ctime);
}]);

... 和我的HTML:

<!DOCTYPE html>
<html lang="en-us" data-ng-app="myApp"><head><title>Time Skew</title>
    <meta charset="UTF-8">
    <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" />
  </head><body>
        <header><nav class="navbar navbar-default">
            <div class="container">
                <div class="navbar-header">
                    <a class="navbar-brand" href="/">AngularJS</a></div>
                <ul class="nav navbar-nav navbar-right">
                    <li><a href="#"><i class="fa fa-home"></i>Home</a></li>
                </ul></div></nav></header>
        <div class="container">
            <div data-ng-controller="mainController">
                <div class="ng-cloak">Browser time: {{ctime}}</div>
                <div class="ng-cloak">Server &nbsp;&nbsp; time: {{stime}}</div>
                <div class="ng-cloak">Time skew: {{skew}}</div></div></div>
       <script src="//code.angularjs.org/1.4.7/angular.min.js"></script>
       <script src="t.js"></script>
    </body></html>

...大致显示的是:

Browser time: 1445735550.067
Server  time: 1445735550.085
Time skew: NaN

当我运行这个程序时,Chrome浏览器的开发者工具JavaScript控制台上没有显示任何内容。(在本次学习中,我看到了很多其他的错误活动……所以我知道它确实显示了我的语法错误、失败的依赖注入等等——当这些错误存在时)。

我已经尝试过使用和不使用parseFloat()。(同样,对class="ng-斗篷"的调用是相关的...把它们拿出来没有效果,尽管它们也没有按预期工作)。事实上,我从*/1000*(分割)表达式中获得了所需的浮点表示,这表明它们在代码中的这两个点上被视为数字。我尝试删除分割并使用parseInt()而不是parseFloat()。

(虽然我认为这与这个问题无关,但这里是node.js“application”,它提供了这个时间服务:

// tserver.js:
var http = require("http");
http.createServer(function (req, response) {
    var headers = {
        'Content-Type:': 'application/json',
        // Extra headers suggested by http://stackoverflow.com/a/29548846/149076
        // ... to resolve: "Control-Allow-Origin' header is present on the requested resource"
        // error from Angular.js $http.get() ...
        'Access-Control-Allow-Headers': 'Content-Type',
        'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
        'Access-Control-Allow-Origin': '*'
        };
    response.writeHead(200, headers);
    var d = new Date();
    response.end(JSON.stringify({ 'server-time': d.getTime() }));
}).listen("8765");

...尽管很明显,我从我的“服务”中获得了一个有效的整数(或应该解析成整数的字符串)(超文本标记语言中显示的值在几毫秒内与“ctime”的值一致)。

当我发布这个问题时,我发现了许多关于JavaScript NaN结果的其他问题...这些问题似乎都不适用于这里。我甚至尝试添加$scope.tst=parseFloat('12345.97')-parseFloat('12345.67');并将其添加到我的超文本标记语言中,得到了一个完全可预测的数字结果...我实际上使用了这些全长数字,如图所示,以确保这不是数字大小的奇怪问题。我还尝试在$作用域上调用". toString()"。Xtime变量。

那我到底做错了什么?

共有1个答案

长孙和悦
2023-03-14

$http是异步的,您试图对请求完成之前不存在的变量使用parseFloat

把你的计算放在promise回调中

$http.get('http://127.0.0.1:8765/').then(function (res) {
    $scope.stime = res['data']['server-time'] / 1000;
    // can do calc here
    $scope.skew = parseFloat($scope.stime) - parseFloat($scope.ctime);
},function (error) {
    $log.warn('Unable to get time');
});
 类似资料:
  • 这是类a的一个函数,我将我的值传递给一个类名,并确认它的寄存器函数。 这是课堂确认。在这门课上,我计划在服务器内部发布数据。url中没有错误。我已经打印了这个代码“System.out.println”(“wei”getPostDataString(postDataParams))我得到了我的价值。但系统显示为空指针。代码的其他部分有错误吗?

  • 问题内容: 我正在使用IText库来促进applet中的pdf导出。在导出调用期间,它失败并显示以下错误: 我在JD Decompiler中打开了Itext jar / PdfPtable.class,并确认该类具有completeRow作为公共方法。 即使在jar / class拥有a的情况下,有人可以解释抛出a的可能情况吗? 这是堆栈跟踪;可能不是很有帮助,因为大多数调用是针对我们的应用程序的

  • 这是我的父类,有两个名为的方法。带有参数的那个在子类中使用。 这是我的子类,在子类的方法中,我使用父类的方法: 当我尝试显示子类的对象时,我得到以下错误: 线程“main”java.lang.StackOverflowError中出现异常

  • 我用的是Android Studio。我编辑了logcat消息,以便只记录要显示的应用程序。但在运行时,我发现logact显示了我的日志和系统日志,如下例所示: 请告诉我为什么logcat仍然显示系统日志

  • 问题内容: public class GuardedBlock { 我正在通过Java Essentials教程学习并发性。找到了守卫的方块并尝试对其进行测试。我无法理解的一件事。 虽然循环是无限的,但是如果您取消注释threadMessage行,则一切正常。为什么? 问题答案: 简短答案 您忘了声明为易失性布尔值。 如果您将字段声明省略为,则不会告诉JVM该字段可以被多线程看到,例如您的示例。

  • 这是我的桌子 我需要在控制台上显示哈里的名字和他45岁的年龄'''