javascript async / await and promise

时间:2019-07-26 14:43:43

标签: javascript promise async-await

我很难理解异步/等待的工作方式。我必须编写一个包含三个功能的程序:func1 func2concatenatedfunc1将字符串作为参数,并在延迟5秒后返回相同的字符串,func2async函数,该函数也将字符串作为参数并返回相同的字符串。 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

我该如何纠正?

3 个答案:

答案 0 :(得分:4)

问题是您从concatenated函数返回的语句将同步运行。这也意味着cd仍然是承诺。

可能的解决方案是:

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