Promise
特点
- 对象的状态不受外界影响。
Promise
对象代表一个异步操作,有三种状态:Pending
(进行中)、Resolved
(已完成,又称Fulfilled)和Rejected
(已失败)。只有异步操作的结果,可以决定当前是哪一种状态,任何其他操作都无法改变这个状态。这也
- 一旦状态改变,就不会再变,任何时候都可以得到这个结果。
Promise
对象的状态改变,只有两种可能:从Pending
变为Resolved
和从Pending
变为Rejected
。只要这两种情况发生,状态就凝固了,不会再变了,会一直保持这个结果。就算改变已经发生了,你再对Promise
对象添加回调函数,也会立即得到这个结果。这与事件(Event)完全不同,事件的特点是,如果你错过了它,再去监听,是得不到结果的。
大概就是这样。有点像一种状态机.
基本的用法.,
function timeout(ms) {
return new Promise((resolve, reject) => {
setTimeout(resolve, ms, 'done');
});
}
timeout(100).then((value) => {
console.log(value);
});
书中提供了这个例子. 稍微改造一下就是能完全讲清楚。
function timeout(b,ms) {
return new Promise((resolve, reject) => {
if(b)
setTimeout(resolve, ms, 'done');
else
setTimeout(reject, ms, 'false');
});
}
timeout(true,100).then((value) => {
console.log(value);
},(error) => { console.log(error) });
返回一个 Promise
对象.
可以在里面写逻辑调用 resolve, reject
选择外面不同的走向。 是调用 then
or error
于是你可以马上就能想到一种应用场景. ajax
也可以将一些普通方法封装在 new Promise
里.
每一个方法都可以有回调。 成功或失败. 不过这样就会有些繁琐.
还有就是可以类似于 ajax
回调那样进行多层嵌套。
使用 Promise
会好看很多.
var p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
var p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
书中的例子.
首先在 p2 调用的时候,会优先执行 p1
. 然后执行 p2
只要你有这一句代码
resolve(p1)
or reject(p1)
然后就会等待 p1
的返回.
然后返回.
就目前来讲还是有些问题.
1 嵌套不能同时多个。需要一个一个执行.
2 如果相互有依赖。 比如 p1
需要返回必须的值给 p2
这样是不行的。
虽然之前说执行有先后顺序,且除了 webworker没有多线程。
如果都是异步操作的话,看上去依然是并行的。 无法产生依赖.
如果我理解正确的话。 这样的用法应用场景就会有些小.
then
var a = new Promise(function(t,f)
{
t(1);
})
var b = new Promise(function(t,f) {
setTimeout(function() {
f(new Error('hahaha'))
},3000);
})
a.then(p => {
console.log(p); return b
}).then(
p => console.log(p),
error => console.log(error)
);
很简单就是这样。
then
可以返回一个参数。 可以采用链式写反.
于是可以像上面那样写。
这样可以避免无限回调的悲剧.