Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
异步/等待在Angular 8中未按预期工作_Angular - Fatal编程技术网

异步/等待在Angular 8中未按预期工作

异步/等待在Angular 8中未按预期工作,angular,Angular,我习惯于在Asp.net中使用async/await。我现在需要在ngBootstrap模式服务中进行几个API调用(4)。用户将单击一个按钮打开一个模式。第一个API调用获取模态所需的基本信息。async OpenModal()方法用async修饰,第一个API调用使用async res,如下所示 this.service.findContent(id).subscribe( async res => { //other code var social

我习惯于在Asp.net中使用async/await。我现在需要在ngBootstrap模式服务中进行几个API调用(4)。用户将单击一个按钮打开一个模式。第一个API调用获取模态所需的基本信息。async OpenModal()方法用async修饰,第一个API调用使用async res,如下所示

this.service.findContent(id).subscribe(
          async res => { 

  //other code 

  var socialDataResult = await this.getSocialData();
  console.log('socialDataResult ', socialDataResult);

  //other code

},


async getSocialData() {

        let result: SocialData;

        this.socialDataService.findSocialData().subscribe(
          async res => {

            let socialData = new SocialData(res);
            console.log('socialData ', socialData);

            result = socialData;
            return result;

          },
          err => {

            console.log(err);
          }
        )

        return result;

      }
我希望代码在写入控制台之前会等待响应从getSocialData返回。按原样,在将控制台日志写入被调用的方法之前,它会将控制台日志写入调用方法的正下方。调用方法中的控制台日志显示“未定义”。正在调用的方法中的控制台日志显示包含所有数据的SocialData对象

还需要注意的是,当我在上面悬停时,请等待这个。getSocialData();,我明白了

(method) ContentComponent.getSocialData(): Promise<SocialData>
(方法)ContentComponent.getSocialData():承诺

非常感谢您的帮助。谢谢

getSocialData
说它是异步的,但实际上它从不等待任何东西。如果您没有利用Observable的任何高级功能,那么最好将
findSocialData()
的结果转换为承诺

async getSocialData() {

    try {
        let res = await this.socialDataService.findSocialData().toPromise();
        let socialData = new SocialData(res);
        console.log('socialData ', socialData);
        return socialData;
    } catch(err) {
        console.log(err); // you might not actually want to eat this exception.
    }
}

我认为您正在混合使用Observable和async/await。 对于您的用例,我建议您只使用可观察的。看起来您有多个呼叫,这些呼叫是链接的,可观察到的帮助您组织呼叫,并以您想要的方式获得响应

您可以查看我的stackblitz,在那里我有一个处理嵌套订阅的解决方案


在这里,处理可观测数据将是一个优雅的解决方案

subscribe()需要一个回调函数,该函数将发出的事件作为参数,但不返回任何内容。从回调函数返回的任何内容都将被忽略。对于从回调返回的承诺,将不会调用then()。我强烈建议你学习可观测数据是如何工作的,并以此为基础,而不是把它们与承诺混为一谈。还有一些关于可观测数据的好教程,你可能需要注意。我喜欢你提出的解决方案,这对我来说很有意义。使用您的方法,您如何等待另一个对象获取ID以进行另一个API调用?另外,您如何读取数据?我假设你的可观测物体中有几个物体。感谢您优雅的解决方案!在这里检查我关于进行另一个API调用的回答。您可以从第一个API获得的响应中读取数据,也可以点击它获取任何中间响应。非常感谢!