Javascript .then()回调中的'return'是从内部作用域返回还是从外部作用域返回?

Javascript .then()回调中的'return'是从内部作用域返回还是从外部作用域返回?,javascript,angular,promise,return,Javascript,Angular,Promise,Return,第17行是否从蓝色或红色范围返回 这与承诺无关。return语句总是从它所在的最里面的函数返回 但是,最重要的是然后回调的返回值成为外部承诺的解析值,这是您从外部函数返回的值。这与承诺无关。return语句总是从它所在的最里面的函数返回 然而,问题是,然后回调的返回值变成了外部承诺的解析值,这是您从外部函数返回的值。首先:请不要将代码作为嵌入图像发布,这会使回答变得更加困难 第二:您也可以引入一个中间变量,并按如下方式编写函数: canActivate() { const returne

第17行是否从蓝色或红色范围返回


这与承诺无关。
return
语句总是从它所在的最里面的函数返回


但是,最重要的是
然后
回调的返回值成为外部承诺的解析值,这是您从外部函数返回的值。

这与承诺无关。
return
语句总是从它所在的最里面的函数返回


然而,问题是,
然后
回调的返回值变成了外部承诺的解析值,这是您从外部函数返回的值。

首先:请不要将代码作为嵌入图像发布,这会使回答变得更加困难

第二:您也可以引入一个中间变量,并按如下方式编写函数:

canActivate() {
    const returnedPromise = this.authService.isAuthenticated()
        .then(this.processAuthenticationValue);

    return returnedPromise;
}


private processAuthenticationValue = (authenticated: boolean) => {
    if (authenticated) {
        return true;
    } else {
        this.router.navigate(['/']);
    }
}

因此,下面是发生的情况:
isAuthenticated()
被调用并返回一些承诺。
then
附加在其承诺链的末尾(该
then
processAuthenticationValue
方法中定义)。从
canActivate
返回的是整个链。

首先:请不要将代码作为嵌入图像发布,这会使回答变得更加困难

第二:您也可以引入一个中间变量,并按如下方式编写函数:

canActivate() {
    const returnedPromise = this.authService.isAuthenticated()
        .then(this.processAuthenticationValue);

    return returnedPromise;
}


private processAuthenticationValue = (authenticated: boolean) => {
    if (authenticated) {
        return true;
    } else {
        this.router.navigate(['/']);
    }
}

因此,下面是发生的情况:
isAuthenticated()
被调用并返回一些承诺。
then
附加在其承诺链的末尾(该
then
processAuthenticationValue
方法中定义)。从
canActivate
返回的是整个链。

isAuthenticated()
是一个异步调用,当它执行时将返回
true
,然后从函数返回。
isAuthenticated()
是一个异步调用,当它执行时,它将返回
true
,然后从函数返回该值。让我澄清一下,
。然后在
isAuthenticated()
解析承诺的值(传递给
authenticated
参数)后,将触发()。因此,如果我没有调用
.then()
并返回
true
,我的承诺仍然不会包含在最初创建承诺时触发的回调中的值i
resolve()
?--另外,我们是否在
之前返回一个未定义值的承诺。然后()将
异步调用?如果我想在调用
canActivate()
的函数中使用此承诺,我是否需要执行一些空检查以确保
。然后()
已完成?
.then()
甚至是异步调用的吗?我保证付给你一百万美元。你现在(我)有多少钱?没有,因为承诺还没有实现(而且永远不会实现,相信我:)。你可以在承诺上附加一个
,然后再附加一个
(然后,你会买一辆法拉利),但在你拿到那一百万美元之前,你不能这样做(好吧,我不知道你的信用评级,但我们不要离题了)。在我看来,“承诺”是软件界的一个伟大名字,因为它捕捉到了正在发生的事情@TheThing@TheThing“然后()的回调在isAuthenticated()解析承诺后触发”-是。“我们是否在异步调用之前返回了一个具有未定义值的承诺。然后()?-否,我们返回了一个未解析的承诺,该承诺将在以后得到满足或拒绝。”。然后()
本身被同步调用,为了创建承诺,您传递的回调始终被异步调用。@Hereticsmonkey谢谢。我的困惑是,我们是否能够/应该在
.then()
块之外处理承诺,因为从技术上讲,我们可以将其返回给调用函数。主要是面向用例的,请让我明白,
。然后在
isAuthenticated()解析承诺的值(传递给
authenticated
参数)后,会触发()的回调。因此,如果我没有调用
.then()
并返回
true
,我的承诺仍然不会包含在最初创建承诺时触发的回调中的值i
resolve()
?--另外,我们是否在
之前返回一个未定义值的承诺。然后()将
异步调用?如果我想在调用
canActivate()
的函数中使用此承诺,我是否需要执行一些空检查以确保
。然后()
已完成?
.then()
甚至是异步调用的吗?我保证付给你一百万美元。你现在(我)有多少钱?没有,因为承诺还没有实现(而且永远不会实现,相信我:)。你可以在承诺上附加一个
,然后再附加一个
(然后,你会买一辆法拉利),但在你拿到那一百万美元之前,你不能这样做(好吧,我不知道你的信用评级,但我们不要离题了)。在我看来,“承诺”是软件界的一个伟大名字,因为它捕捉到了正在发生的事情@TheThing@TheThing“然后()的回调在isAuthenticated()解析承诺后触发”-是。“我们是否在异步调用之前返回了一个具有未定义值的承诺。然后()?-否,我们返回了一个未解析的承诺,该承诺将在以后得到满足或拒绝。”。然后()
本身被同步调用,为了创建承诺,您传递的回调始终被异步调用。@Hereticsmonkey谢谢。我的困惑是,我们是否能够/应该在
.then()
块之外处理承诺,因为从技术上讲,我们可以将其返回给调用函数。大多数情况下,用例定向器还没有尝试过这种方法,但我认为这种方法行不通。如果
。然后
r之后触发该怎么办