我很难理解异步/等待的工作方式。我必须编写一个包含三个功能的程序:func1
func2
和concatenated
。
func1
将字符串作为参数,并在延迟5秒后返回相同的字符串,func2
是async
函数,该函数也将字符串作为参数并返回相同的字符串。 concatenated
是一个函数,它使用两个字符串(s1,s2)
作为参数,并使用上述两个函数((func1(s1) and func2(s2))
)在5秒钟后返回它们的并置结果。因此,如果我们将("hello"," world")
传递给concatenated
,它将返回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")
此代码仅给我:
hello
world
我该如何纠正?
答案 0 :(得分:4)
问题是您从concatenated
函数返回的语句将同步运行。这也意味着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
})
请注意,异步功能将始终返回承诺。
答案 1 :(得分:1)
您可以在5秒钟后获得结果,如下所示:
function func1(x) {
return new Promise(resolve => {
setTimeout(() => {
resolve(x);
}, 5000);
});
}
async function func2(x) {
const a = await func1(x);
return a;
}
async function concatenated(a,b){
const [c,d] = await Promise.all([func2(a), func2(b)])
return c+d;
}
(async function main() {
const ret = await concatenated("hello"," world")
console.log(ret)
})()
使用JavaScript async/await
语法,您可以编写异步代码,例如同步样式。不需要promise.then
,不需要回调。与其他语言(例如转到Java
答案 2 :(得分:-2)
您似乎对控制台日志有误解。常规IProfileService
将始终放置换行符,这就是为什么您在两行而不是一行中看到问候世界的原因。假设您使用的是Node.js,则可以使用以下内容写到控制台,而无需使用换行符来实现所需的结果:
console.log