在Javascript

时间:2017-06-14 19:03:31

标签: javascript angular

我有一个提供程序,应该允许我从我需要的API返回特定数据。我有这个功能:

public getStoryCount(key: string, val: number) {
    return this.client.getEntries({
        'content_type': xxxxxxxxxxxxxx,
        [key]: val,
    }).then((entries:any) => {
        return entries.total;
    });
}

这是我第一次真正使用promises,但我试图在一个组件中调用它来获取值。我希望能够获得值entry.total,当我在console.log中获取输出时。

我正在构建一个数据数组,以便在我的视图中使用,如下所示:

this.homeScreen.push({
  'count': Provider.getStoryCount('sys.id', xxxx)
});

当我在console.log中使用Provider函数时,我可以看到promise中的值,它看起来像这样:

__zone_symbol__state : true
__zone_symbol__value : 13 // this is the value I need to get

如何将数字13保存到我的阵列homeScreen [' count']值?或者我做错了什么?

4 个答案:

答案 0 :(得分:1)

您目前正在返回Promise而非实际值。这意味着将组件代码修改为:

Provider.getStoryCount('sys.id', xxxx)
    .then((entries:any) => {
        this.homeScreen.push({
          'count': entries.total
        });
    }
});

应该有用。

您还可以使Provider服务获取值并将其存储为Observable,以便组件可以订阅该值。

答案 1 :(得分:1)

由于promises是异步的,因此您实际上并没有像想象的那样返回entries.total。

您可能需要提供自己的回调函数,或者只是返回promise(由this.client.getEntries生成)并将then添加到结果中。它可能看起来像这样:

public getStoryCount(key: string, val: number) {
    return this.client.getEntries({
        'content_type': xxxxxxxxxxxxxx,
        [key]: val,
    });
    // The 'then' will be added later
}

// ...

// Get the promise from the provider, and invoke 'then' here.
var storyCountPromise = Provider.getStoryCount('sys.id', xxxx);
storyCountPromise.then((entries:any) => {
    this.homeScreen.push({
      'count': entries.total
    });
});

答案 2 :(得分:0)

这是一个异步操作。您需要在then中传递函数:

Provider.getStoryCount('sys.id', xxxx)
  .then((total) => {
    this.homeScreen.push({
     'count': total
    });
  });

答案 3 :(得分:0)

首先,要将promise的结果映射到另一个值,请使用map。

public getStoryCount(key: string, val: number) {
    return this.client.getEntries({
        'content_type': xxxxxxxxxxxxxx,
        [key]: val,
    }).map((entries:any) => {
        return entries.total;
    });
}

然后在调用promise returns函数时使用then来获得结果

Provider.getStoryCount('sys.id', xxxx).then((total) => ...use total...);