译者按:
对于
Promise
,也许你会用了,却并不理解;也许你理解了,却只可意会不可言传。这篇博客将从3个简单的视角理解
Promise
,应该对你有所帮助。
为了保证可读性,本文采用意译而非直译,并且对源代码进行了大量修改。另外,本文版权归原作者所有,翻译仅用于学习。
示例1
中,
asyncFunc()
函数返回的是一个
Promise
实例:
function asyncFunc() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('Hello, Fundebug!'); }, 100); }); } asyncFunc() .then(function(x) { console.log(x); });
|
1秒之后,
Promise
实例的状态变为
resolved
,就会触发
then
绑定的回调函数,打印
resolve值
,即”Hello, Fundebug!”。
那么,什么是
Promise
呢?
-
Promise
调用是阻塞的
-
Promise
中保存了异步操作结果
-
Promise
是一个事件
Promise
调用是阻塞的
示例2
可以帮助我们理解
阻塞
:
function asyncFunc() { return new Promise(function(resolve, reject) { setTimeout(function() { resolve('Hello, Fundebug!'); }, 1000); }); } async function main() { const x = await asyncFunc(); console.log(x); } main();
|
以上代码是采用Async/Await语法写的,与
示例1
完全等价。
await
的中文翻译即为”等待”,这里可以”望文生义”。因此,相比于使用
Promise
实现,它更加直观地展示了什么是
阻塞
。
事实上,使用
Promise
实现时,也需要等待
asyncFunc()
执行,之后再调用
then
绑定的回调函数。因此,调用
Promise
时,代码也是阻塞的。
Promise中保存了异步操作结果
如果某个函数返回
Promise
实例,则这个
Promise
最初相当于一个空白的容器,当函数执行结束时,其结果将会放进这个容器。
示例3
通过数组模拟了这个过程:
function asyncFunc() { const blank = []; setTimeout(function() { blank.push('Hello, Fundebug!'); }, 1000); return blank; } const blank = asyncFunc(); console.log(blank); setTimeout(function() { const x = blank[0]; console.log(x); }, 2000);
|
开始时,
blank
为空数组,1秒之后,”Hello, Fundebug!”被添加到数组中,为了确保成功,我们需要在2秒之后从
blank
数组中读取结果。
对于
Promise
,我们不需要通过数组或者其他变量来传递结果,
then
所绑定的回调函数可以通过参数获取函数执行的结果。
Promise是一个事件
示例4
模拟了事件: