如何在data
内更改asyncCall()
的值并将其设置为诺言的解析值b
。
我想要的是asyncCall()
将返回b
。
但是发生的事情是asyncCall()
返回了Promise对象。
function resolveAfter2Seconds(data) {
return new Promise(resolve => {
resolve(data);
});
}
async function asyncCall() {
let data = "a";
var result = await resolveAfter2Seconds("b");
data = result;
return data;
}
asyncCall();
答案 0 :(得分:3)
使用IIFE
使函数异步将自动使其返回一个Promise。您要么必须等待它,要么使用.then来访问解析的值。 IIFE代表“立即调用函数表达式” – Tim VN
function resolveAfter2Seconds(data) {
return new Promise(resolve => {
resolve(data);
});
}
async function asyncCall() {
let data = "a";
var result = await resolveAfter2Seconds("b");
data = result;
return data;
}
(async function() {
console.log(await asyncCall())
})()
答案 1 :(得分:1)
异步函数将始终返回Promise(请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function#Return_value)。
如果将console.log(result)语句放在asyncCall()函数主体中,您将意识到该值实际上已在此处解析,并且可以按预期使用。但是,正如所记录的那样,异步函数的返回值将始终是“承诺的”,因此您也必须“等待”该函数调用。
要在最高(全局)级别上执行此操作,可以使用IIFE(立即调用函数表达式):
(async () => console.log(await asyncCall()))();
或使用Promise.then()退回到经典的回调函数:
asyncCall().then(value => console.log(value));
某些浏览器还支持顶层等待表达式:
await asyncCall();
答案 2 :(得分:0)
声明函数将返回经典的Promise。 因此您必须使用回调或等待。
异步函数asyncCall()将返回Promise而不是您想要的结果。
asyncCall().then((data) => console.log('in data is your result'));
答案 3 :(得分:0)
异步功能 本身返回承诺:
function resolveAfter2Seconds(data) {
return new Promise(resolve => {
return resolve(data);
});
}
async function asyncCall() {
const result = await resolveAfter2Seconds("b");
return result;
}
asyncCall().then(
data => console.log(data)
);
答案 4 :(得分:0)
您必须使用await
来从async
函数获得结果,但是不能在await
函数之外使用async
,因此必须包装在async
函数中。
或者您也可以使用.then()
在其回调中获取结果。
function resolveAfter2Seconds(data) {
return new Promise(resolve => {
resolve(data);
});
}
async function asyncCall() {
let data = "a";
var result = await resolveAfter2Seconds("b");
data = result;
return data;
}
// Approach 1: wrap it in an async fintion
(async ()=>{
console.log('result:', await asyncCall());
})();
// Apprach 2: Use then
asyncCall().then(result => console.log('result:', result));