关于Angular $ q defer对象的问题

时间:2014-04-24 06:01:46

标签: angularjs

我是Angular的新人,我现在已经玩了近两周了。

我遇到了一个我设法解决的实施问题。该问题的概述是,当我尝试使用服务{{1}添加新信息时,我有main.html显示所有用户信息,但服务功能this.list没有更新}。下面是代码的工作版本以及无法运行的版本。

即使我解决了自己的问题,我在这里发布的原因是我很想知道为什么。我想了解延迟对象的两个示例之间的区别。第二个例子不起作用,但第一个例子工作正常。

差异是否与延迟对象有关,我只能在函数内声明它?也许我无法在全球范围内宣布它?

我希望有人可以解释为什么第一个例子有效但第二个例子没有。


#1示例

this.addNewUser

#2示例

//Add single user
this.addNewUser = function(username,email){

    **var deferred_2 = $q.defer(); //current active object for asyn ajax call**

    $http({
        method : 'GET',
        url : '/app/add.php',
        params: {
            "name":username,
            "email":email,
        },
    })
    .success(function(data, status, headers, config) {

        deferred_2.resolve('Success');
    })
    .error(function(data, status, headers, config) {

        console.log('Data :: ' + data);
        console.log('Status :: ' + status);
        console.log('Config :: ' + config);

    });

    return deferred_2.promise; //Promise object is the results

}

我面临的问题是,当我调用下面显示的另一个函数时,它不会使用刚刚使用服务中的函数插入的新数据更新 var deferred_2 = $q.defer(); //current active object for asyn ajax call //Add single user this.addNewUser = function(username,email){ $http({ method : 'GET', url : '/app/add.php', params: { "name":username, "email":email, }, }) .success(function(data, status, headers, config) { deferred_2.resolve('Success'); }) .error(function(data, status, headers, config) { console.log('Data :: ' + data); console.log('Status :: ' + status); console.log('Config :: ' + config); }); return deferred_2.promise; //Promise object is the results } main.html

this.addNewUser

1 个答案:

答案 0 :(得分:3)

AngularJS中的服务是单例,这意味着您的第一个函数已经解析(或拒绝)全局deferred_2

来自:https://docs.angularjs.org/api/ng/service/ $ q

  

承诺对象的目的是允许感兴趣的各方   在完成时访问延迟任务的结果。

由于延迟任务已经完成,后续将其标记为已解决或已拒绝的调用不会触发您附加到第二个承诺的任何回调。我认为没有任何理由在功能之间共享延迟 - 如果您希望在添加新用户后更新列表,我建议您查看Angular的$emit$broadcast和{{ 1}}在$on对象上进行事件的方法:)