代码之家  ›  专栏  ›  技术社区  ›  Gezzasa

如果只返回一个对象,则API调用不在typescript上工作

  •  1
  • Gezzasa  · 技术社区  · 6 年前

    我有一个任务,我需要从API返回10个查克·诺里斯的笑话。这一部分我说得对,但第二部分(每5秒随机播放一个笑话)让我有点崩溃。

    按数量取笑 获取笑话(数量){ 康斯特·乔科雷=[] 施工员Randomjokearray=[]; 如果(金额>1){ this.http.get(http://api.icndb.com/jokes/random/'+amount).subscribe(data=>){ //测试以查看调用是否成功 if(data[“type”]==“success”)。{ 对于(var i=0;i<=data[“value”].length;i++){ jokearray.push(数据[“值”[i]); } }否则{ console.warn(“api调用”getjokes“失败”); } (}); }否则{ this.http.get('http://api.icndb.com/jokes/random/'+amount).subscribe(data=>){ //测试以查看调用是否成功 if(data[“type”]==“success”)。{ randomjokearray=data[“value”[0]; console.log(randomjokearray); }否则{ console.warn(“api调用”getjokes“失败”); } (}); } 如果(金额>1){ //返回jokearray 返回(jokearray); }否则{ 返回(Randomjokearray); } } < /代码>

    randomjokearray Always comes back as undefined.

    这个功能在一个服务中,我对打字和角度还比较陌生。我肯定我用错了。有人能告诉我如何从API中只返回一个笑话吗?

    如果我复制了10的API调用,那么当只调用1时,将返回以下内容。

    从主文件

    this.configservice.getjokes(1).subscribe(j=>this.randomjokearray=j);
    < /代码> 
    
    

    从服务文件

    for(var i=0;i<=data[“value”].length;i++){
    randomjokearray.push(数据[“值”[i]);
    }
    
    返回(Randomjokearray);
    < /代码> 
    
    

    .

    // Get jokes by amount
    getJokes(amount) {
    const jokeArray = [];
    const randomJokeArray = [];
    if(amount > 1){
      this.http.get(http://api.icndb.com/jokes/random/' + amount).subscribe(data => {
        // Test to see if call was successful
        if(data["type"] === 'success'){
            for(var i = 0; i <= data["value"].length; i++){
              jokeArray.push(data["value"][i]);
            }
        } else {
          console.warn("API Call 'getJokes' was unsuccessful");
        }
      });
    } else {
      this.http.get('http://api.icndb.com/jokes/random/' + amount).subscribe(data => {
        // Test to see if call was successful
        if(data["type"] === 'success'){
          randomJokeArray = data["value"][0];
          console.log(randomJokeArray);
        } else {
          console.warn("API Call 'getJokes' was unsuccessful");
        }
      });
    }
    
        if(amount > 1){
          // Return the jokeArray
          return of (jokeArray);
        } else {
          return of (randomJokeArray);
        }
    
    }
    

    randomJokeArray总是返回未定义状态。

    这个功能在一个服务中,我对打字和角度还比较陌生。我肯定我用错了。有人能告诉我如何从API中只返回一个笑话吗?

    如果我复制10的API调用,那么当只调用1时,将返回以下内容。

    从主文件

    this.configService.getJokes(1).subscribe(j => this.randomJokeArray = j);
    

    从服务文件

    for(var i = 0; i <= data["value"].length; i++){
        randomJokeArray.push(data["value"][i]);
    }
    
    return of (randomJokeArray);
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   Amit Chigadani    6 年前

    您的代码中有三个问题

    1. 您的组件正在订阅 Subscription 不是一个 Observable . 所以你应该 map 关于返回的响应 http 而不是订阅,因为您希望将Observable返回到组件。

      this.http.get('http://api.icndb.com/jokes/random/' + amount).pipe(map(data => {
         // Test to see if call was successful
                   .........................................
      }));
      
    2. 主要问题:您没有等待异步执行完成。

      移动你的 if(amount > 1){...} 内部代码 http.get.map()

      return this.http.get('http://api.icndb.com/jokes/random/' + amount).pipe(map(data => {
          // Test to see if call was successful
          if(data["type"] === 'success'){
            randomJokeArray = data["value"][0];
            console.log(randomJokeArray);
          } else {
            console.warn("API Call 'getJokes' was unsuccessful");
          }
      
          if(amount > 1){
              // Return the jokeArray
              return of (jokeArray);
          } else {
              return of (randomJokeArray);
          }
      }));
      
    3. 在前面添加返回语句 http.GET.MaP()

      return this.http.get('http://api.icndb.com/jokes/random/' + amount).pipe(map(data => {
             // Test to see if call was successful
             .........................................
      }));