【问题标题】:How to get the value from a resolved promise如何从已解决的承诺中获取价值
【发布时间】:2015-05-12 02:01:15
【问题描述】:

我是 Angular 的新手,很难理解如何从已解决的承诺中获得价值。我使用了 $q.all([element1.$promise, e2.$promise])。我得到了 element1,它是一个 json 对象。对于 element2,它是一个包含 2.0 的标量。我试过 element[1] 就像 element[0] 但它不包含任何属性,所以我不知道如何获取值。我试过 .val、.data 等。我知道 web api 和 angular 都在 2.0。

              resolve: {
            accountResource: "accountResource",
            account: function(accountResource, $stateParams, $q) {

              var info = accountResource.get({ accountId: $stateParams.accountId });
              var currentBalance = accountResource.getCurrentBalance({ accountId: $stateParams.accountId });

              return $q.all([info.$promise, currentBalance.$promise]);
            }

    vm.account = account[0];
    vm.currentBalance = account[1];

资源功能

    function accountResource($resource) {
    var webApiUrl = "https://localhost:44301";
    return $resource(webApiUrl + '/api/account/:accountId', {}, {
        get: {
            method: 'GET'
        },          
        query: {
            method: 'GET', 
            isArray: true, 
            url: webApiUrl + '/api/account/search/:queryMethod/:queryString'
        },
        getCurrentBalance: {
            method: 'GET', 
            url: webApiUrl + '/api/account/getcurrentbalance/:accountId'
        }
    });
}

【问题讨论】:

  • 与从未解决的承诺中获取值的方式相同。
  • 您访问的 account 是什么?
  • 它只是一个值,而不是一个属性,它只是一个参数,不需要.val它或类似的东西。

标签: angularjs promise


【解决方案1】:

你可以调用$q.all喜欢这个(用字典而不是数组):

return $q.all({info: info.$promise, currentBalance: currentBalance.$promise})

然后以这种方式获取信息:

vm.account = account.info;
vm.currentBalance = account.currentBalance;

尝试像这样重写你的资源:

function accountResource($resource) {
var webApiUrl = "https://localhost:44301";
// Add second parameter {accountId: "@accountId"}
return $resource(webApiUrl + '/api/account/:accountId', {accountId: "@accountId"}, {
    get: {
        method: 'GET'
    },          
    query: {
        method: 'GET', 
        isArray: true, 
        url: webApiUrl + '/api/account/search/:queryMethod/:queryString'
    },
    getCurrentBalance: {
        method: 'GET', 
        url: webApiUrl + '/api/account/getcurrentbalance/:accountId'
    }
});

}

更新

您可以在accountResoure 中将transformResponse 属性添加到您的getCurrentBalance 函数中。并将您的值从 API 转换为 json 格式。

getCurrentBalance: {
    method: 'GET', 
    url: webApiUrl + '/api/account/getcurrentbalance/:accountId',
    transformResponse: function (balanceFromApi) { 
        return { balance: balanceFromApi }; 
    }
}

最后你可以得到信息,像这样:

vm.account = account.info;
vm.currentBalance = account.balance;

我使用$httpBackend 服务对其进行了测试,现在一切正常。希望这会有所帮助。

【讨论】:

  • 我更喜欢字典而不是数组。但这并不能解决问题。 account.currentBalance 不包含任何属性。 account.currentBalance => e {$promise: Promise, $resolved: true, toJSON: function, $get: function, $save: function…}
  • 您能否展示您的函数 getCurrentBalance from accountResource?
  • 不,它不应该与资源有任何关系,因为它返回值“2.0”。我只是没有可以参考的属性,比如信息。 info.BillingAddress1。 currentBalance 本身就是另一个承诺。我认为我不需要更改我的 web api 来返回 {balance: currentBalance}。但我知道这应该有效。但不是 currentBalance 本身。
  • 哦,现在我明白了。最简单的方法是从您的后端返回 json,这类似于您的版本 {balance: 2.0}。我认为,这是一个很好的做法。稍后我可以考虑其他方法。 %)
  • 谢谢。我知道我缺少一些东西,transformResponse。
猜你喜欢
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 2022-12-17
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2019-04-26
相关资源
最近更新 更多