我如何从承诺主体外部访问承诺结果

时间:2019-11-02 19:16:34

标签: javascript promise

我有一个Promise函数,例如getName(code),所以我们有:

getName(code)
  .then(...)
  .catch(...);

我们想要定义一个函数以将结果名称返回给它并对其进行处理。

我们如何关联定义的函数和方法调用?

例如:

async function name(code) {
  getName(code)
    .then(...)
    .catch(...);
  return ???
}

for (let i = 0; i <= 10; i++) {
  let x = name(i);
  // Do something with x, for example:
  alert(x);
}

P.S:我知道结果可以在.then主体内访问,但是我想在name函数范围内访问它,并从函数中返回它。

2 个答案:

答案 0 :(得分:4)

使用await

async function name(code) {
    try {
        const name = await getName(code);
        // Do something here
        return name;
    } catch (e) {
        console.log('[ERROR]', e);
    }
}

请记住,为了使用await,应将代码包含在async函数中。

答案 1 :(得分:2)

有人问我会提出什么建议。

您得到一个异步结果。这意味着您的函数将在异步结果可用之前很久就返回。因此,您不能直接返回异步结果。

用于传递回异步结果的通常两个选项是回调或返回promise。无论哪种情况,函数的调用者都必须以返回特定方式使用异步结果,而不是直接返回值。

在您的情况下,您已经在使用诺言,所以有意义的是只返回您已经拥有的诺言:

function name() {
    return getName(code).then(...);
}

在此处或在async中使用await函数没有任何好处,因为您只有一个已经可以实现的异步操作。只要兑现承诺。我们不在这里放置.catch()处理程序,因为在此级别上不需要进行特定的错误处理-我们希望被调用方按原样看到被拒绝的诺言。

然后,要使用此函数返回承诺,可以在其上使用.then()

name().then(result => {
    // use the result in here
    console.log(result);
}).catch(err => {
    console.log(err);
});

或者您可以使用await

async function someOtherFunc() {
    try {
        let result = await name();
        // do something with result here
    } catch(e) {
        console.log(e);
    }
}
  

我知道结果可以在.then主体内部访问,但是我想在名称函数作用域内访问它并从函数中返回它。

您不能在.then()处理程序之外访问它,也不能直接从函数中返回它。那是Javascript中异步操作的局限性。该函数本身甚至会在调用异步回调之前返回,因此异步结果在该函数返回时不可用。这就是诺言的目的。您返回承诺并进行设置,以便异步结果是承诺的已解决值。然后,调用者使用返回的承诺来注册对最终解析值(或拒绝错误)的兴趣。