Promise

当这些概念可以用值表示时,处理抽象概念通常更容易。 在异步操作的情况下,你不需要安排将来某个时候调用的函数,而是返回一个代表这个未来事件的对象。

这是标准类Promise的用途。 Promise是一种异步行为,可以在某个时刻完成并产生一个值。 当值可用时,它能够通知任何感兴趣的人。

创建Promise的最简单方法是调用Promise.resolve。 这个函数确保你给它的值包含在一个Promise中。 如果它已经是Promise,那么仅仅返回它 - 否则,你会得到一个新的Promise,并使用你的值立即结束。

  1. let fifteen = Promise.resolve(15);
  2. fifteen.then(value => console.log(`Got ${value}`));
  3. // → Got 15

为了获得Promise的结果,可以使用它的then方法。 它注册了一个回调函数,当Promise解析并产生一个值时被调用。 你可以将多个回调添加到单个Promise中,即使在Promise解析(完成)后添加它们,它们也会被调用。

但那不是then方法所做的一切。 它返回另一个Promise,它解析处理器函数返回的值,或者如果返回Promise,则等待该Promise,然后解析为结果。

Promise视为一种手段,将值转化为异步现实,是有用处的。 一个正常的值就在那里。promised 的值是未来可能存在或可能出现的值。 根据Promise定义的计算对这些包装值起作用,并在值可用时异步执行。

为了创建Promise,你可以将Promise用作构造器。 它有一个有点奇怪的接口 - 构造器接受一个函数作为参数,它会立即调用,并传递一个函数来解析这个Promise。 它以这种方式工作,而不是使用resolve方法,这样只有创建Promise的代码才能解析它。

这就是为readStorage函数创建基于Promise的接口的方式。

  1. function storage(nest, name) {
  2. return new Promise(resolve => {
  3. nest.readStorage(name, result => resolve(result));
  4. });
  5. }
  6. storage(bigOak, "enemies")
  7. .then(value => console.log("Got", value));

这个异步函数返回一个有意义的值。 这是Promise的主要优点 - 它们简化了异步函数的使用。 基于Promise的函数不需要传递回调,而是类似于常规函数:它们将输入作为参数并返回它们的输出。 唯一的区别是输出可能还不可用。