Promise
当这些概念可以用值表示时,处理抽象概念通常更容易。 在异步操作的情况下,你不需要安排将来某个时候调用的函数,而是返回一个代表这个未来事件的对象。
这是标准类Promise
的用途。 Promise
是一种异步行为,可以在某个时刻完成并产生一个值。 当值可用时,它能够通知任何感兴趣的人。
创建Promise
的最简单方法是调用Promise.resolve
。 这个函数确保你给它的值包含在一个Promise
中。 如果它已经是Promise
,那么仅仅返回它 - 否则,你会得到一个新的Promise
,并使用你的值立即结束。
let fifteen = Promise.resolve(15);
fifteen.then(value => console.log(`Got ${value}`));
// → Got 15
为了获得Promise
的结果,可以使用它的then
方法。 它注册了一个回调函数,当Promise
解析并产生一个值时被调用。 你可以将多个回调添加到单个Promise
中,即使在Promise
解析(完成)后添加它们,它们也会被调用。
但那不是then
方法所做的一切。 它返回另一个Promise
,它解析处理器函数返回的值,或者如果返回Promise
,则等待该Promise
,然后解析为结果。
将Promise
视为一种手段,将值转化为异步现实,是有用处的。 一个正常的值就在那里。promised 的值是未来可能存在或可能出现的值。 根据Promise
定义的计算对这些包装值起作用,并在值可用时异步执行。
为了创建Promise
,你可以将Promise
用作构造器。 它有一个有点奇怪的接口 - 构造器接受一个函数作为参数,它会立即调用,并传递一个函数来解析这个Promise
。 它以这种方式工作,而不是使用resolve
方法,这样只有创建Promise
的代码才能解析它。
这就是为readStorage
函数创建基于Promise
的接口的方式。
function storage(nest, name) {
return new Promise(resolve => {
nest.readStorage(name, result => resolve(result));
});
}
storage(bigOak, "enemies")
.then(value => console.log("Got", value));
这个异步函数返回一个有意义的值。 这是Promise
的主要优点 - 它们简化了异步函数的使用。 基于Promise
的函数不需要传递回调,而是类似于常规函数:它们将输入作为参数并返回它们的输出。 唯一的区别是输出可能还不可用。