首先,我是async
函数的新手。这段代码中的问题在哪里?我只是输出了test 1
和test 2
。
let isAvailable = false;
console.log('test1');
let asynchFunc = () => {
return new Promise(() => {
if (isAvailable === true) {
console.log('here asyncFunc');
}
});
}
(async () => {
await asynchFunc();
});
console.log('test2');
isAvailable = true;
答案 0 :(得分:0)
你的意思是像这样调用异步函数吗?
(async () => {
await asynchFunc();
})();
(注意最后添加的()
)
我不确定您在此尝试测试的内容,异步功能仍会看到false
值。您可以通过将您的功能更改为:
let asynchFunc = () => {
return new Promise(() => {
console.log('check isavailable:', isAvailable);
});
}
如果您只是在寻找可以让您使用异步功能的设置,那么您可以使用以下代码:
const sleep = (time) => new Promise((resolve) => setTimeout(resolve, time));
let isAvailable = false;
(async () => {
console.log('isAvailable:', isAvailable);
await sleep(1000);
console.log('isAvailable:', isAvailable);
})();
console.log('test2');
isAvailable = true;
请注意,使用像这样的睡眠功能等待某些东西可用是完全错误的做事方式。你永远不应该有一个isAvailable
标志,这个值应该只是一个可以解决的承诺。你来自哪种语言?你的实际问题是什么?我们可以帮助您更好地解决现实问题。
答案 1 :(得分:0)
let isAvailable = false;
console.log('test1');
let asyncFunc = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (isAvailable === true) {
resolve('here asyncFunc');
}
}, 2000);
});
}
(async() => {
return await asyncFunc(); // await used here is optional
})().then(v => {
console.log(v); // prints value after 2 seconds.
});
console.log('test2');
isAvailable = true;
所有Promises
都需要解决或拒绝。在你的情况下,你没有。为了查看异步函数中的值,我将值传递给resolve
回调。
在异步函数中,返回值时可以使用
await
键,因为async function
的返回值隐式包含在Promise.resolve
中。
答案 2 :(得分:0)
这是一个你可以玩的功能,可以帮助你理解更多的东西。请注意,您正在使用立即调用的函数表达式(IIFE)从同步代码切换到异步代码,只要您了解原始代码中的console.log('test2')
可能无法以与您的处理顺序相同的顺序进行处理,这很好。代码看起来可能。但是,你没有调用IIFE,所以只需在它的末尾添加()即可。
即,
(function (){})();
(()=>{})();
(async function(){})();
(async ()=>{})();
至于你的其余代码,你不能解决或拒绝你的承诺,从函数中正确地返回promise,你需要尝试{} catch {}你的异步函数,否则拒绝()承诺将无法处理。
(function(){
let isAvailable = false;
let asynchFunc = () => new Promise((resolve,reject) => {
if (isAvailable === true) {
console.log('Available');
resolve(true);
}else{
console.log('Not available');
reject(false)
}
});
(async () => {
try{
// isAvailable = true; // test with me.
console.log('test1');
// result is always true, unless there is an error.
// but if there is an error
// the rejected promise will go to catch(e){}.
let result = await asynchFunc();
console.log('test2');
isAvailable = true;
}catch(e){
console.log('Error:',e)
}
})();
})();
答案 3 :(得分:0)
我不知道我是否以更好的方式说出来:
如果您在承诺中添加timeout
,则会在到达此变量的检查之前执行isAvailable = true
指令,否则isAvailable
将保留false
。
您可以测试以下两种情况
let isAvailable = false;
console.log('test1');
let asynchFunc = () => {
return new Promise((resolve, reject) => {
if (isAvailable === true) {
console.log('here asyncFunc');
resolve('has been available');
} else {
reject('still not available')
}
});
}
(async () => {
try {
let res = await asynchFunc();
console.log(res);
} catch (e) {
console.log(e);
}
})();
console.log('test2');
isAvailable = true;

let isAvailable = false;
console.log('test1');
let asynchFunc = () => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (isAvailable === true) {
console.log('here asyncFunc');
resolve('has been available');
} else {
reject('still not available')
}
}, 2000);
});
}
(async () => {
try {
let res = await asynchFunc();
console.log(res);
} catch (e) {
console.log(e);
}
})();
console.log('test2');
isAvailable = true;