0

我不会在其他函数中处理承诺,但在第一个回调变量工作后不会改变。请帮我。在这里查看我的代码:

    this.handlerLocalDef = function(defer) {
        var hash = {};

        defer.then(
               function(response) {
                   hash = response;
               },

               function(err) {
                   showPopup(err);
               }
        );

        return hash;
    };



    var initialized = function()  {
        var localRegDef = Localization.getLocalizedDefer('regularform'),
            localPaymDef = Localization.getLocalizedDefer('payment');


            localizeRegForm = self.handlerLocalDef(localRegDef, localizeRegForm);

            $timeout(function() {
                console.log("localizeRegForm", localizeRegForm);
            },5000);
   }();  

控制台日志返回我 localizeRegForm: {}

4

2 回答 2

1

通过这样做hash = response,您只是将局部变量设置为引用另一个对象。原始返回对象的接收者仍然保留该对象。一个快速的解决方案是做angular.extend(hash,response);. 这会将 respose 的所有成员复制到 引用的对象中hash,这是原始返回的对象。所以接收者会突然看到那些成员。

警告:既不适用于值(字符串、数字、布尔值、未定义、null),也不适用于数组。


这是上述有效建议的小提琴:http: //jsfiddle.net/sVRCg/3/


但是我觉得整个设置都是错误的。你怎么知道hash实际是用 扩展的response?轮询(例如setTimeout)是一个尴尬的解决方案。我建议您改为返回承诺;通过这种方式,您可以准确地找到响应可用的时间。

另一种方法是如何ngResource做到的;这很复杂,请查看代码。

于 2013-09-26T13:34:22.217 回答
0

这不是你进行异步编程的方式。

您不要设置任意超时并希望此时您有数据,您必须按照预期的方式使用延迟对象并使用回调。这是重组代码以使其正常工作的一种方法。根据您的具体情况,它可能会或可能不会达到您的目的:

    this.handlerLocalDef = function(defer,callback) {

        defer.then(
               function(response) {
                   callback.apply(this,[response])
               },

               function(err) {
                   showPopup(err);
               }
        );

    };



    var initialized = function()  {
        var localRegDef = Localization.getLocalizedDefer('regularform'),
            localPaymDef = Localization.getLocalizedDefer('payment');


            self.handlerLocalDef(localRegDef,function(response) {
                console.log(response);
            });
   }(); 
于 2013-09-26T13:55:40.233 回答