理解承诺和等待

时间:2018-05-22 10:33:10

标签: javascript promise async-await

我只想了解 Promises 等待的工作方式。
我希望通过按该顺序记录1, 2, 3来解决此问题。 目前它会记录1, 3, 2

我知道 Promise 在这里确实没有用,但在我的程序中它有其他用途,所以需要留下来。从Caller函数到Test的路径也需要保留(如果需要,您可以更改这些但只是知道它们在那里是有原因的)

我的问题是如何等待Caller功能解决?

这是我的代码:



function Test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

function Caller() {
  Test();
}

console.log('1');
Caller();
console.log('3');




我已经尝试了我所理解的,即使Caller()函数等待Test Promise,但这当然使得Caller()函数异步,因此我们仍然得到1,3,2

async function Caller() {
    await Test();
}

是否有一些方法可以在不使函数异步的情况下使用await?

4 个答案:

答案 0 :(得分:5)

  • 你只能await一个返回一个承诺的函数(嗯,不完全正确,如果它没有返回一个承诺,它会创建一个立即解析的承诺)
  • 当你在异步函数中时,你只能await

function test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

async function caller() {
  console.log('1');
  await test();
  console.log('3 (this is blocked awaiting the promise');
}

caller()
console.log("This is not blocked because caller is async");

答案 1 :(得分:1)

这是一种非常直接,简单的方式来做你所要求的。

  

self.viewControllers关键字只能在函数内部使用   用await定义。



async




这是Google发表的一篇很好的文章,主题是: Async functions - making promises friendly

引用source

答案 2 :(得分:0)

以下是如何使用这样的函数:



function sleep(ms) {
  return new Promise(r => {
    setTimeout(() => r(), ms);
  });
}

(async () => {
  console.log(1);
  await sleep(1000); // 1s
  console.log(2);
  await sleep(2000) // 2s
  console.log(3)
})();




答案 3 :(得分:-1)

以前的答案都是正确的,但我觉得这个答案更有意义。它对原始问题的代码更准确:



function Test() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      console.log('2');
      resolve();
    }, 2000);
  })
}

function Caller() {
  return Test();
}

(async() => {
  console.log('1');
  await Caller();
  console.log('3');
})();