gpt4 book ai didi

javascript - 试图了解 Angular 5 的范围。然后

转载 作者:行者123 更新时间:2023-11-30 14:43:27 29 4
gpt4 key购买 nike

在这个例子中,我创建的 promise 工作正常。

但是来自 google api 的 promise 不起作用。

它说this.youtube未定义

index.html
<script src="https://apis.google.com/js/api.js"></script>

app.component.html

<button (click)="customClick()">custom Promise</button>
<hr>

<hello name="{{ youtube }}"></hello>
<button (click)="youtubeClick()">youtube Promise</button>

app.component.ts

import { Component } from '@angular/core';
import { } from '@types/gapi.client.youtube';
import { } from '@types/gapi.auth2';


export class AppComponent {

name = 'Angular 5';
youtube = 'youtube';

egPromise(){
return new Promise<void>((resolve, reject) => {
setTimeout(function(){
resolve();
}, 1000);
});
}

customPromise(){
this.egPromise().then( () => {
this.name = 'from .then angular 5'
});
}

customClick(){
this.customPromise();
}
/****************************************************/

youtubePromise(){
gapi.client.init({
apiKey: 'key',
clientId: 'id',
scope: "https://www.googleapis.com/auth/youtube.readonly",
discoveryDocs: [
"https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest"
]
}).then(() => {
this.youtube = 'from .then youtube'
});
}

youtubeClick(){
gapi.load('client:auth2', this.youtubePromise);
}

编辑:解决方案/解释

在@vivek-doshi 的帮助下

我发现这篇文章搜索“绑定(bind)这个”

https://www.sitepoint.com/bind-javascripts-this-keyword-react/

正如帖子所解释的那样

“在您的代码中并不总是很清楚 this 将引用什么,尤其是在处理回调函数时,您无法控制其调用点。”

因为我使用的是 google API,所以我无法控制该代码。

“这是因为当调用 promise 的回调时,函数的内部上下文发生了变化,this 引用了错误的对象。”

加载库的函数使用回调函数,我什至没有想到第一个回调是问题所在。

因此,如帖子所述,使用 ES2015 Fat Arrows 函数。

“他们总是使用封闭范围内的 this 的值。” ...“无论您使用多少层嵌套,箭头函数都将始终具有正确的上下文。”

所以不是创建 bindingselfthatwherever ,我认为使用 => 更干净

另一件让我感到困惑的事情是 google api 要求不带参数的回调。

所以如果你尝试使用 const that = this;
gapi.load('client:auth2', this.start(that) );

它会提示。

但使用 gapi.load('client:auth2', () => this.start() );我不是在争论。

这件事对很多人来说可能很简单,但既然我在学习,我会尽量让它对其他正在学习的人来说也简单。

谢谢大家

最佳答案

在这里你通过调用失去了 this 的范围:

gapi.load('client:auth2', this.youtubePromise);

将上面的代码改为:

gapi.load('client:auth2', () => this.youtubePromise()); // ES6 Way
// OR
gapi.load('client:auth2', this.youtubePromise.bind(this)); // Traditional old way of doing

WORKING DEMO

关于javascript - 试图了解 Angular 5 的范围。然后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49314827/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com