2016-04-15 60 views
0

我希望這只是一個愚蠢的事情,我忽略或不正確地做,因爲它是在殺我。角度服務承諾和lodash創建空對象

這是一個角度控制器的一部分,該角度控制器基於已知的管理員ID爲一組銷售代表輪詢數據庫(Parse)。

第一部分檢查管理器狀態並返回組memberId's。

然後根據生成的memberId對另外的組成員進行另一次檢查。因此,有一組頂級經理和一組managerId,每個都有一個子組中的銷售代表。

這裏所有的東西都檢查出來了(它可能不是最有效的方法,但它可以工作......現在 - 有時候我不會編寫整個應用程序,我會重做它)。

注意... LoggingService只是一個奇特的console.log輸出。

問題出在最後的承諾返回變量... managerGroup。

最終LoggingService.info(' - > managerGroup',managerGroup)();的輸出。是正確的,它也是輸出到$ scope.pageData。如下:

Object 
    managerId: "sL0lGF3sYw" 
    groupMembers: Array [2] 
    0: Object 
     managerId: "fytsi64nkp" 
     salesGroup: false 
    1: Object 
     managerId: "gcMIA9xnn0" 
     salesGroup: Array [3] 
     0: "6MunY0xGvp" 
     1: "9O4ly8Coyw" 
     2: "K67ZSUsE0q" 

這是一直在壓抑我的大腦的部分。如果我在managerGroup.groupMembers上運行日誌,結果是:

["fytsi64nkp", "gcMIA9xnn0"] 

也許這是我的代碼,也許我錯過了一些東西。

var ClientAccess = Parse.Object.extend('ClientAccessLU'); 
    var query   = new Parse.Query(ClientAccess); 

    query.equalTo('managerId', userId); 

    query.first().then(function(results) { 
     // check for manager status 
     if (results) { 
      LoggingService.info('user is manager', results)(); 
      $rootScope.managerFlag = true; 
      // returns the current user managerID and group members 
      return results.attributes; 
     } else { 
      LoggingService.warn('user is not a manager')(); 
      $rootScope.managerFlag = false; 
      return false; 
     } 
    }).then(function(managerData) { 
     // create a default managerGroup 
     var managerGroup = { 
      'managerId': managerData.managerId, 
      'groupMembers': managerData.salesRepIds 
     }; 

     // check if members are managers of additional groups and build the inner group 
     lodash.each(managerGroup.groupMembers, function(member, index){ 
      UserLU.getGroupMembers(member).then(function(innerGroup){ 
       // add the innerGroup member id's to the main group 
       managerGroup.groupMembers[index] = { 
        'managerId': member, 
        'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
       }; 
      }); 
     }); 
     return managerGroup; 
    }).then(function(managerGroup){ 
     // then check the innermost group for client sales data as these members are sales reps 
     LoggingService.info('-> managerGroup', managerGroup)(); 



     $scope.pageData = managerGroup; 
    }); 

任何幫助表示讚賞......謝謝。

+0

'managerGroup.groupMembers'是數組還是對象? – kiro112

+0

@ kiro112它是一個數組 – orderofout

回答

0

使用Promise而不是lodash.each

Promise.all(managerGroup.groupMembers, function (member, index) { 
    return UserLU.getGroupMembers(member) 
     .then(function(innerGroup){ 
      // add the innerGroup member id's to the main group 
      return member = { 
       'managerId': member, 
       'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
      }; 
     }); 
}).then(function (managerGroupMembers) { 
    managerGroup.groupMembers = managerGroupMembers; 

    return managerGroup; 
}); 
+0

我喜歡這個想法,但我認爲它不會像現在這樣工作... lodash位已經在承諾鏈中運行了 - Promise.all不應該是可靠的。也許我太過於複雜了。但我想限制我的嵌套承諾。 – orderofout

+0

即使它不能與我的代碼一起工作,我仍然認爲這是正確的,因爲這是另一個鏈接諾言中的鏈接承諾,它只是不起作用......但是,您肯定已通知我爲什麼我得到我收到的答覆,所以這是一個解決方案。我只需要重寫我的代碼就可以工作。 – orderofout

0

按照我所審覈,對managerGroup.groupMembers記錄你所得到的

var managerGroup = { 
      'managerId': managerData.managerId, 
      'groupMembers': managerData.salesRepIds 
     }; 

輸出作爲異步你是下面的代碼運行在你完成這段代碼之前去下一個。

lodash.each(managerGroup.groupMembers, function(member, index){ 
      UserLU.getGroupMembers(member).then(function(innerGroup){ 
       // add the innerGroup member id's to the main group 
       managerGroup.groupMembers[index] = { 
        'managerId': member, 
        'salesGroup': innerGroup.salesRepIds?innerGroup.salesRepIds:false 
       }; 
      }); 
     }); 

希望這可以幫助你。

+0

在lodash有時間回來之前,我正在進行下一個承諾 - 這就是爲什麼@ kiro112建議使用Promise ...這是有道理的。 – orderofout