api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse'

Posted

技术标签:

【中文标题】api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性\'getResponse\'【英文标题】:api call working in one method but not working in another method ---TypeError: Cannot read property 'getResponse' of undefinedapi调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse' 【发布时间】:2018-03-26 19:00:51 【问题描述】:

更新 2: 伙计们,我用 Kushpf 回答了这个问题已经解决了......但现在我又得到了另一个......我想当我要求我需要传递正确的 id 时......我什至硬编码但我仍然​​收到错误..你能告诉我如何修复它吗...

GET http://sports.com/Rats/color/black?RatId=20060&timestamp=1508039029859 404 (Not Found)
An error occurred Response _body: ""timestamp":1508039067018,"status":404,"error":"N…ssage available","path":"/Rats/color/black"", status: 404, ok: false, statusText: "Not Found", headers: Headers, …

更新 1:我尝试了 Derek 解决方案,但仍然发生同样的错误。我打印出来并看到 self...因为我没有看到 sportsservice...有什么办法可以修复它

打印的自我价值

init elemen: M.fn.init(1), _event: …, option: …, tabl: M.fn.init(1), wrappe: M.fn.init(1), …
altRowTemplate:
ƒ ()
columns:
(13) […, …, …, …, …, …, …, …, …, …, …, …, …]
content:
[div.k-grid-content.k-auto-scrollable, prevObjec: M.fn.init(1), contex: undefined]
dataSource:
init option: …, _ma: …, _prefetc: …, _dat: init(21), _pristineDat: Array(21), …
element:
[div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable]
footer:
[prevObjec: M.fn.init(1), contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, selecto: ".k-grid-footer"]
options:
prefi: "", nam: "Grid", column: Array(13), toolba: null, autoBin: false, …
pager:
init elemen: M.fn.init(1), _event: …, option: …, dataSourc: init, linkTemplat: ƒ, …
resizable:
init elemen: M.fn.init(1), _event: …, option: …, orientatio: "horizontal", _positionMous: "x", …
rowTemplate:
ƒ ()
scrollables:
(2) [div.k-grid-header-wrap.k-auto-scrollable, div.k-grid-content.k-auto-scrollable, prevObjec: M.fn.init(1), contex: undefined]
selectable:
init elemen: M.fn.init(1), _event: …, option: …, _marque: M.fn.init(1), _lastActiv: null, …
table:
[table.k-selectable, prevObjec: M.fn.init(1), contex: undefined]
tbody:
[tbody, prevObjec: M.fn.init(1), contex: undefined]
thead:
[thead, prevObjec: M.fn.init(1), contex: undefined]
wrapper:
[div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable, contex: div#animals.contractPopupkGrid.k-grid.k-widget.k-reorderable]
_cellId:
"animals_active_cell"
_data:
(10) [init, init, init, init, init, init, init, init, init, init]
_draggableInstance:
init elemen: M.fn.init(1), _event: …, option: …, _activate: false, userEvent: init, …
_errorHandler:
ƒ ()
_events:
dataBoun: Array(1)
_group:
false
_groupableClickHandler:
ƒ (n)
_isMobile:
false
_muteRebind:
false
_progressHandler:
ƒ ()
_refreshHandler:
ƒ ()
_setContentWidthHandler:
ƒ ()
_size:
widt: 960, heigh: 381
__proto__:
r
我正在尝试学习 Angular 和 typescript。 我在使用新服务时遇到错误。 但是当我通过 rxjs 使用另一个服务时,它不会抛出错误。 你能告诉我如何解决它吗? 在下面提供相关代码。 完整的代码,因为它很大,我会给出它的要点

// 此处发生错误 this.sportsservice.getResponse(vals, 'get', "")

https://gist.github.com/texirv0203/e071a9ebea3a6aa0f8a0c65d47f75807

    $("#AnimalRatsGrid .RatNameFile").bind("click", function(e) 
      console.log("I am here");
       alert("I am here");
      //let params=values.selectedRow.sunDocID;
      //let url='http://sun.isports.com/PdfRatViewer.aspx?Ratid='+params+'&Ratsource=DISTRIBUTIONRat'

      kendo.ui.progress($("#loading"), true);
      //let vals ="Rats/color/black?RatId="+values.selectedRow.RatId;
                        let vals ="Rats/color/black?RatId="+"7887878787";

                //let vals ="Rats/color/black?RatId="+"233223232323";
                    this.sportsservice.getResponse(vals, 'get', "")
                                        .subscribe(data =>                      
                               //this.saveData(data, values.selectedRow.RatName);
                              //this.saveData(data, "untitled.txt");
                              var blob = new Blob([data],  type: 'application/octet-stream' );

                             // var blob = Blob "size": "11573", "type": "application/octet-stream"

                             let fire = "untitled1.txt";
                              this.sportsservice.saveAs(blob,fire);

                                                //kendo.ui.progress($("#loading"), false);
                                        ,
                                        err =>  
                             //kendo.ui.progress($("#loading"), false);
                             
                        );




    );

错误

VM61482:27 TypeError: Cannot read property 'getResponse' of undefined
    at htmlAnchorElement.eval (animal.ts:427)
    at HTMLAnchorElement.dispatch (jquery-2.2.3.js:4737)
    at HTMLAnchorElement.elemData.handle (jquery-2.2.3.js:4549)
    at ZoneDelegate.invokeTask (zone.js:236)
    at Object.onInvokeTask (core.umd.js:6233)
    at ZoneDelegate.invokeTask (zone.js:235)
    at Zone.runTask (zone.js:136)
at HTMLAnchorElement.ZoneTask.invoke (zone.js:304)

此方法没有错误

  public snakeRocket(values)
  
    let grid = $("#AnimalRatsGrid").data("kendoGrid");

    let dataitem = grid.dataItem(grid.select());
    grid.dataSource.remove(dataitem);

    $("#divRocketAnimalRat").hide();

    let snakes = [
         
          "id": values.mainId,
          "RatDtos" : [
            "RatId":dataitem.RatId,
            "RatName": dataitem.RatName,
            "RatType": dataitem.RatType,
            "RatData": this.encodeBase64,
            "notes": "",
            "notesId": 123,
            "sunDocID": 123,
            "url": "://localhost:1299/upload",
            "categoryType": "",
            "Timestamp": dataitem.date,
            "userID": dataitem.userID,
            "addedByName": dataitem.addedByName,
            "operationType": "Rocket",

            ]          
         
      ];

    this.sportsService.getResponse("player/color/Rat/", "post", snakes[0])
      .subscribe(data => 
          if (data.code === "S001") 
           else 
          
        ,
        err => 
        
      );

    $(".k-pager-numbers li").last().find("a").click();
  

【问题讨论】:

你可能需要修复你的this 参考 - 在this.sportsService.getResponse console.log('this object', this);查看它所引用的内容。 【参考方案1】:

你必须小心this 指的是什么:

在您的第二个(工作)示例中,您在设置了this.sportservice 值的类上下文中执行this.sportservice.getResponse()

但是,在您的错误示例中,您在传递给$().bind() 函数的回调中执行this.sportservice.getResponse()。此回调具有不同的上下文,因此具有不同的 this 值。您可以阅读更多关于this 工作原理here 的信息。

一个简单的解决方案是创建一个对您实际想要使用的this 上下文的新引用。例如:

var self = this;
$("#AnimalRatsGrid .RatNameFile").bind("click", function(e) 
  console.log("I am here");
   alert("I am here");
  //let params=values.selectedRow.sunDocID;
  //let url='http://sun.isports.com/PdfRatViewer.aspx?Ratid='+params+'&Ratsource=DISTRIBUTIONRat'

  kendo.ui.progress($("#loading"), true);
  //let vals ="Rats/color/black?RatId="+values.selectedRow.RatId;
                    let vals ="Rats/color/black?RatId="+"7887878787";

            //let vals ="Rats/color/black?RatId="+"233223232323";
                self.sportsservice.getResponse(vals, 'get', "")
                                    .subscribe(data =>                      
                           //this.saveData(data, values.selectedRow.RatName);
                          //this.saveData(data, "untitled.txt");
                          var blob = new Blob([data],  type: 'application/octet-stream' );

                         // var blob = Blob "size": "11573", "type": "application/octet-stream"

                         let fire = "untitled1.txt";
                          self.sportsservice.saveAs(blob,fire);

                                            //kendo.ui.progress($("#loading"), false);
                                    ,
                                    err =>  
                         //kendo.ui.progress($("#loading"), false);
                         
                    );




);

【讨论】:

更新:我尝试了 Derek 解决方案,但仍然发生同样的错误..我打印出来并看到 self...因为我没有看到 sportsservice...有什么办法可以修复它打印自我价值 @jajajaja 整个函数在什么上下文中运行?你能确保该函数也存在于this 那里吗?【参考方案2】:

Derek 的解释是对的,但是声明var self = this; 的地方是错误的。

由于this.sportsservice.getResponse$("#AnimalRatsGrid .RatNameFile").bind("click", function(e) 内被调用,而$("#AnimalRatsGrid .RatNameFile").bind("click", function(e) 本身在dataBound: function(e) 内,您需要在其外部声明self。

但是,您已经声明了一个变量let that = this;,其用途完全相同。所以不要使用this.sportsservice.getResponse,而是使用that.sportsservice.getResponse

//let vals ="Rats/color/black?RatId="+"233223232323";
that.sportsservice.getResponse(vals, 'get', "")
    .subscribe(data => 

另外,考虑将that 重命名为self,以便其他开发人员更容易理解(self 是用于此目的的通用标识符)

【讨论】:

那个问题已经解决了......但现在我又得到了另一个......我想当我要求我需要传递正确的 id 时......我什至硬编码但仍然出现错误......可以你告诉我如何解决它... GET sports.com/Rats/color/… 404 (Not Found) 发生错误响应 _body: ""timestamp":1508039067018,"status":404,"error":"N...ssag跨度> 你能告诉我为什么我们需要声明外部数据绑定函数......你能解释一下......这样我以后就不会遇到这个问题了...... 嘿,如果我将调试器保留在订阅方法中,它就不会进入...任何想法:( 您可以使用日志记录进行检查。如果有帮助,请采纳答案。

以上是关于api调用在一种方法中工作但在另一种方法中不起作用---TypeError:无法读取未定义的属性'getResponse'的主要内容,如果未能解决你的问题,请参考以下文章

数据方法中的数组在一种方法中得到更新,但在另一种方法中仍然为空

为什么这个lambda表达式在语句中不起作用,但在方法中工作?

xctest 如何在另一种测试方法中使用在一种测试方法中捕获的数据

查询在 PHPMyAdmin 中工作但在 PHP 中不工作

请求 REST POST API 在 Postman 中工作,但在 Alamofire 中不起作用

Jquery 对象 innerHTML 在 Firefox 中工作但在 IE 中不工作?