Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.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
Javascript 如何在完成服务调用后正确返回布尔值_Javascript_Angular_Typescript_Rxjs - Fatal编程技术网

Javascript 如何在完成服务调用后正确返回布尔值

Javascript 如何在完成服务调用后正确返回布尔值,javascript,angular,typescript,rxjs,Javascript,Angular,Typescript,Rxjs,下面是calculate函数块,其中if条件中有一个函数调用,用于使用api调用检查项是否存在 但是方法itemExistsInBasket总是返回false,因为服务调用不会完成,我必须使用wait来实现这一点 你能告诉我一个更好的方法来解决下面的问题吗 calculate(){ if(itemExistsInBasket()){ // service call } } itemExistsInBasket(){ let itemE

下面是calculate函数块,其中if条件中有一个函数调用,用于使用api调用检查项是否存在

但是方法itemExistsInBasket总是返回false,因为服务调用不会完成,我必须使用wait来实现这一点

你能告诉我一个更好的方法来解决下面的问题吗

calculate(){
     if(itemExistsInBasket()){
           // service call
     }
  }

itemExistsInBasket(){
  
    let itemExists = false;
    this._sharedService.post('API/checkItemInBask', requestBody).subscribe((res: any) => {
        itemExists = res.exists ? true : false;
    });

   return itemExists; // always returns false
}
简单回答:你不能

HTTP请求是异步的。Angular不知道HTTP请求何时响应。在执行return itemExists时,变量itemExists尚未在订阅中更新,因此它返回以前的值false

有关异步数据如何工作的更多信息,请参阅

您需要在需要响应的地方订阅。请注意,一旦一个反应性范例被引入到应用程序中,它的所有直接依赖项也都应该是反应性的

此外,您似乎正在尝试进行嵌套订阅。相反,您需要使用RxJS高阶映射操作符(如switchMap)从一个可观察对象切换到另一个可观察对象。您还可以使用RxJS过滤管道,以避免在第一个调用的响应为false时触发第二个调用

试试下面的方法

从“rxjs/operators”导入{filter,switchMap}; 算计{ 这是._sharedService.post'API/checkItemInBask',requestBody.pipe filterres=>res.exists,//this.\u sharedService.someOtherReq .订阅{ 下一步:res=>{}, 错误:错误=>{} }; } 简单回答:你不能

HTTP请求是异步的。Angular不知道HTTP请求何时响应。在执行return itemExists时,变量itemExists尚未在订阅中更新,因此它返回以前的值false

有关异步数据如何工作的更多信息,请参阅

您需要在需要响应的地方订阅。请注意,一旦一个反应性范例被引入到应用程序中,它的所有直接依赖项也都应该是反应性的

此外,您似乎正在尝试进行嵌套订阅。相反,您需要使用RxJS高阶映射操作符(如switchMap)从一个可观察对象切换到另一个可观察对象。您还可以使用RxJS过滤管道,以避免在第一个调用的响应为false时触发第二个调用

试试下面的方法

从“rxjs/operators”导入{filter,switchMap}; 算计{ 这是._sharedService.post'API/checkItemInBask',requestBody.pipe filterres=>res.exists,//this.\u sharedService.someOtherReq .订阅{ 下一步:res=>{}, 错误:错误=>{} }; }
Angular中的服务在依赖于异步方法(如API调用)时应返回承诺。您应该在组件中订阅它们,并根据结果呈现页面

我不确定您的代码应该做什么,因此我将提供另一个示例:

服务代码:

fetchItemsInBasket(): Promise<Item>{
 
    return this._sharedService.post('API/itemsInBasket', requestBody)
                 .pipe(...) // get list of items in basket
}
在恩戈尼特,我们应该:

ngOnInit() {
  this.service.itemExistsInBasket()
    .subscribe(res => {
        this.itemInBasket = res;
        this.basketInformationReady = true;
      });
}

Angular中的服务在依赖于异步方法(如API调用)时应返回承诺。您应该在组件中订阅它们,并根据结果呈现页面

我不确定您的代码应该做什么,因此我将提供另一个示例:

服务代码:

fetchItemsInBasket(): Promise<Item>{
 
    return this._sharedService.post('API/itemsInBasket', requestBody)
                 .pipe(...) // get list of items in basket
}
在恩戈尼特,我们应该:

ngOnInit() {
  this.service.itemExistsInBasket()
    .subscribe(res => {
        this.itemInBasket = res;
        this.basketInformationReady = true;
      });
}

返回一个Promisereturn一个PromiseHi Jakub,我想做的是,itemExistsInBasket函数应该检查一个项目是否存在,如果它存在,它应该返回true,否则返回false。但从我的例子来看,它总是返回false@Onera如果项目存在,最终会发生什么?如果它不存在该怎么办?如果它存在,ItemExistsSinbasket应该返回true,否则返回false。如果这是真的,我的计算函数将继续进行,否则我不会。但在我的情况下,你知道它总是返回false,因为它是asnyccall@Onera我想你应该看看迈克尔的答案。无论您的意思是什么,都应该放在这里:next:res=>{if res{}}Hi Jakub,我想做的是,itemExistsInBasket函数应该检查一个项是否存在,如果它存在,它应该返回true,否则返回false。但从我的例子来看,它总是返回false@Onera如果项目存在,最终会发生什么?如果它不存在该怎么办?如果它存在,ItemExistsSinbasket应该返回true,否则返回false。如果这是真的,我的计算函数将继续进行,否则我不会。但在我的情况下,你知道它总是返回false,因为它是asnyccall@Onera我想你应该看看迈克尔的答案。无论您的意思是什么,都应该放在这里:next:res=>{if res{}
ngOnInit() {
  this.service.itemExistsInBasket()
    .subscribe(res => {
        this.itemInBasket = res;
        this.basketInformationReady = true;
      });
}