我有一个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
函数范围内访问它,并从函数中返回它。
答案 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中异步操作的局限性。该函数本身甚至会在调用异步回调之前返回,因此异步结果在该函数返回时不可用。这就是诺言的目的。您返回承诺并进行设置,以便异步结果是承诺的已解决值。然后,调用者使用返回的承诺来注册对最终解析值(或拒绝错误)的兴趣。