【问题标题】:AngularJS : multiple asynchronous AJAX callsAngularJS:多个异步 AJAX 调用
【发布时间】:2015-05-10 11:59:48
【问题描述】:

我正在调用多个 ajax 调用,但代码仅在执行所有 ajax 调用后才到达 API。

Javascript:

 function test = function(){
        var entity = {};
        entity.Number = 1;
        appFactory.testPostCall(entity, 'ApiController/TestMethod');

        entity.Number = 2;
        appFactory.testPostCall(entity, 'ApiController/TestMethod');
    }

应用工厂

factory.testPostCall = function (number, appendUrl) {
        var q = $q.defer(); 

        $http({
            method: "POST",
            url: url + appendUrl,
            data: number
        }).success(function (data, status, headers, config) { 
            q.resolve(data);
        }).error(function (data, status, headers, config) {
            q.reject(data); 
        });
        return q.promise;
    }

API

[HttpPost]
        public Nullable<int> TestMethod(TestEntity entity)
        {
            return entity.Number;
        }

我跟踪了如何通过断点运行代码。调用 test() 函数执行以下操作:

javascript -> appFactory
javascript -> appFactory
API
API 
//with the parameter Entity having the value Entity.Number = 2 for both API calls.

我尝试在

处放置断点
entity.Number = 2; 

并等待 API 被调用,但似乎代码正在等待函数结束,直到 API 被调用。我对这种行为感到非常困惑,我实际上期待类似以下内容:

javascript -> appFactory -> API //entity.Number = 1

javascript -> appFactory -> API //entity.Number = 2

链接运作良好,但我需要独立运行,我真的很想了解发生了什么。

    entity.Number = 1;
            appFactory.testPostCall(entity, 'ApiController/TestMethod')
.then(function(data){
            entity.Number = 2;
            appFactory.testPostCall(entity, 'ApiController/TestMethod');
    });

谢谢!!!

【问题讨论】:

    标签: javascript ajax angularjs post asynchronous


    【解决方案1】:

    在两种猜测中,您都将entity 传递给您的函数。你猜怎么了?在 JS 中,所有 对象都是通过引用而不是复制来传递的。类似的问题到处都是:Why isn't this object being passed by reference when assigning something else to it?

    你有两种可能得到你期望的行为:

    • 您可以使用闭包来确保按您的意愿传递参数
    • 您可以浅拷贝您的对象

    不过,我个人会选择第三种选择,即不要盲目地将对象传递给您的 API。

    【讨论】:

    • 嘿,这让我大开眼界 O_O 谢谢!对我来说少了一个问题,API 现在接收 1 和 2。现在唯一的问题是 API 调用仅在整个函数执行后才被调用。
    • @ElementaryStudentProgramming:这就是Promise 的目的。它是非阻塞的,异步的。
    • 我不太明白,如果它是“非阻塞的”,第一个 appFactory.testPostCall(entity, 'ApiController/TestMethod'); 不应该在调用它的那一刻到达 API 吗?相反,代码在到达 API 之前等待整个 javascript 函数执行完毕。
    • @ElementaryStudentProgramming:不。如果您想进行类比,appFactory.testPostCall 会立即返回,但会继续在后台工作。这是我能得到的最接近 400 个字符内实际发生的情况。如果它没有这样做,那么它就会被阻塞。
    • 哦,我明白了,非常感谢!我只是想知道为什么它在运行 API 之前仍然等待整个函数被执行。我的“GET”调用的行为符合预期 javascript -&gt; appFactory -&gt; API 。无论如何,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 1970-01-01
    • 2019-10-05
    相关资源
    最近更新 更多