javascript异步/等待和承诺

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

我很难理解async/await是如何工作的。我必须制作一个包含三个函数的程序:
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
都是承诺(对于
未定义的
,是回调的结果)。