javascript异步/等待和承诺
我很难理解async/await是如何工作的。我必须制作一个包含三个函数的程序:javascript异步/等待和承诺,javascript,promise,async-await,Javascript,Promise,Async Await,我很难理解async/await是如何工作的。我必须制作一个包含三个函数的程序:func1func2和串联的。 func1将字符串作为参数并在延迟5秒后返回相同的字符串,func2是一个async函数,它也将字符串作为参数并返回相同的字符串串联是一个函数,它将两个字符串(s1,s2)作为参数,并使用上述两个函数((func1(s1)和func2(s2)))在5秒后返回其串联结果。因此,如果我们将(“hello”,“world”)传递给连接的,它应该返回hello world。我的代码是: fun
func1
func2
和串联的
。
func1
将字符串作为参数并在延迟5秒后返回相同的字符串,func2
是一个async
函数,它也将字符串作为参数并返回相同的字符串串联
是一个函数,它将两个字符串(s1,s2)
作为参数,并使用上述两个函数((func1(s1)和func2(s2))
)在5秒后返回其串联结果。因此,如果我们将(“hello”,“world”)
传递给连接的,它应该返回hello world
。我的代码是:
function func1(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 5000);
});
}
async function func2(x) {
const a = await func1(x);
return a;
}
function concatenated(a,b){
const c = func2(a).then(result =>{console.log(result)});
const d = func2(b).then(result =>{console.log(result)});
return (c+d) ;
}
concatenated("hello"," world")
此代码只给我:
你好
世界
我怎样才能纠正这一点?您似乎误解了控制台日志。常规的控制台.log
总是会换行,这就是为什么您在两行而不是一行上看到hello world的原因。假设您使用的是Node.js,您可以使用以下命令在不使用换行符的情况下写入控制台,以实现所需的结果:
process.stdout.write(结果)代码>您似乎误解了控制台日志。常规的控制台.log
总是会换行,这就是为什么您在两行而不是一行上看到hello world的原因。假设您使用的是Node.js,您可以使用以下命令在不使用换行符的情况下写入控制台,以实现所需的结果:
process.stdout.write(结果)
问题是连接的
函数的返回语句将同步运行。这也意味着c
和d
仍然是承诺
一个可能的解决办法是:
async function concatenated(a,b){
const c = await func2(a);
const d = await func2(b);
return (c+d);
}
concatenated("hello", " world").then(result => {
console.log(result); // hello world
})
请注意,异步函数将始终返回一个承诺。问题在于,连接的函数的返回语句将同步运行。这也意味着c
和d
仍然是承诺
一个可能的解决办法是:
async function concatenated(a,b){
const c = await func2(a);
const d = await func2(b);
return (c+d);
}
concatenated("hello", " world").then(result => {
console.log(result); // hello world
})
请注意,异步函数总是会返回一个承诺。您可以在5秒钟后得到如下结果:
函数func1(x){
返回新承诺(解决=>{
设置超时(()=>{
决议(x);
}, 5000);
});
}
异步函数func2(x){
常数a=等待函数1(x);
返回a;
}
异步函数连接(a,b){
const[c,d]=等待承诺。全部([func2(a),func2(b)])
返回c+d;
}
(异步函数main(){
const ret=等待连接(“你好”,“世界”)
控制台日志(ret)
})()
您可以在5秒钟后得到如下结果:
函数func1(x){
返回新承诺(解决=>{
设置超时(()=>{
决议(x);
}, 5000);
});
}
异步函数func2(x){
常数a=等待函数1(x);
返回a;
}
异步函数连接(a,b){
const[c,d]=等待承诺。全部([func2(a),func2(b)])
返回c+d;
}
(异步函数main(){
const ret=等待连接(“你好”,“世界”)
控制台日志(ret)
})()
为什么您的连接的
函数不使用等待
,而是使用然后
?请注意,c
和d
都是承诺(对于未定义的
,是回调的结果)。为什么您的连接的
函数不使用等待
,而是使用然后
?请注意,c
和d
都是承诺(对于未定义的
,是回调的结果)。