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

Javascript 如何从承诺体外部访问承诺结果,javascript,promise,Javascript,Promise,我有一个promise函数,例如getNamecode,因此我们有: getName(code) .then(...) .catch(...); 我们想定义一个函数,将结果名返回给它,并对其进行处理 我们如何将定义的函数和方法调用联系起来 例如: async function name(code) { getName(code) .then(...) .catch(...); return ??? } for (let i = 0; i <= 10; i

我有一个promise函数,例如getNamecode,因此我们有:

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);
}
注:我知道结果可以在body中访问,但我想在name函数范围内访问它,并从函数返回它。

使用

记住,为了使用wait,代码应该包含在异步函数中。

使用


记住,为了使用wait,代码应该包含在异步函数中。

有人问我有什么建议

您有一个异步结果。这意味着您的函数早在异步结果可用之前就返回了。因此,不能直接返回异步结果

回传异步结果的通常两个选项是回调或返回承诺。在这两种情况下,函数的调用方都必须以返回异步结果的特定方式使用异步结果,而不是作为直接返回值

在您的情况下,您已经在使用承诺,因此有意义的是,只需返回您已经拥有的承诺:

function name() {
    return getName(code).then(...);
}
在这里或等待使用异步函数没有任何好处,因为您只有一个已经得到承诺的异步操作。只要回报你的承诺。我们不在这里放置.catch处理程序,因为在这个级别上不需要特定的错误处理-我们希望被拒绝的承诺被调用方看到原样

然后,要使用此返回承诺的函数,您可以使用。然后在其上:

或者您可以使用wait:

我知道结果可以在body中访问,但我想在name函数范围内访问它,并从函数返回它


您不能在.then处理程序之外访问它,也不能直接从函数返回它。这是Javascript中异步操作的一个限制。函数本身在调用异步回调之前返回,因此异步结果在函数返回时不可用。这就是承诺的目的。您返回承诺并对其进行设置,以使异步结果成为承诺的解析值。然后,调用方使用返回的承诺注册对最终解决的值的兴趣或拒绝错误。

有人问我有什么建议

您有一个异步结果。这意味着您的函数早在异步结果可用之前就返回了。因此,不能直接返回异步结果

回传异步结果的通常两个选项是回调或返回承诺。在这两种情况下,函数的调用方都必须以返回异步结果的特定方式使用异步结果,而不是作为直接返回值

在您的情况下,您已经在使用承诺,因此有意义的是,只需返回您已经拥有的承诺:

function name() {
    return getName(code).then(...);
}
在这里或等待使用异步函数没有任何好处,因为您只有一个已经得到承诺的异步操作。只要回报你的承诺。我们不在这里放置.catch处理程序,因为在这个级别上不需要特定的错误处理-我们希望被拒绝的承诺被调用方看到原样

然后,要使用此返回承诺的函数,您可以使用。然后在其上:

或者您可以使用wait:

我知道结果可以在body中访问,但我想在name函数范围内访问它,并从函数返回它


您不能在.then处理程序之外访问它,也不能直接从函数返回它。这是Javascript中异步操作的一个限制。函数本身在调用异步回调之前返回,因此异步结果在函数返回时不可用。这就是承诺的目的。您返回承诺并对其进行设置,以使异步结果成为承诺的解析值。然后调用方使用返回的承诺来注册对最终解析值的兴趣或拒绝错误。

在这种情况下,name变量将包含承诺数据,不是吗?@AlirezaZojaji是的,它将包含承诺数据。顺便说一句,我已经改进了捕获错误的答案。请记住,这仍然不会从函数返回名称。它返回一个最终解析值为name的承诺。所有异步函数都返回一个承诺。此函数的调用方仍然必须使用wait或.then来检索该值。我认为这实际上并没有回答OP的问题。你建议@jfriend00?@Vishnudev做什么?我在我的建议中发布了一个答案。在这种情况下,name变量将包含promise数据,不是吗?@AlirezaZojaji是的,它会。我已经改进了答案,以便抓住他
rors顺便说一句。请记住,这仍然不会从函数返回名称。它返回一个最终解析值为name的承诺。所有异步函数都返回一个承诺。此函数的调用方仍然必须使用wait或.then来检索该值。我不认为这实际上回答了OP的问题。你建议@jfriend00?@Vishnudev做什么?我在我的建议中发布了一个答案。你不能从函数中返回它。该值仅在将来可用。你将得到的最好结果是通过将回报放在承诺链的前面来回报承诺,但在我调用的名称上,你将始终需要等待。你不能从函数中回报承诺。该值仅在将来可用。你能得到的最好的回报就是把回报放在承诺链的前面,以此来回报你的承诺,但是在我打电话给你的名字上,你永远需要等待。谢谢你的回答和澄清。你所写的第二种方法正是我想要的,显然是在外部访问变量。然后是不可能的。@Vishnudev-是的,我看到你问我的建议,并认为你是OP。好的,我不确定OP会看到这个。谢谢你的回答和澄清。你所写的第二种方法正是我想要的,显然是在外部访问变量。然后是不可能的。@Vishnudev-是的,我看到你问我的建议,并认为你是OP。好的,我不确定OP会看到这个。
name().then(result => {
    // use the result in here
    console.log(result);
}).catch(err => {
    console.log(err);
});
async function someOtherFunc() {
    try {
        let result = await name();
        // do something with result here
    } catch(e) {
        console.log(e);
    }
}