
|
导读网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立... 网页的本质就是超级文本标记语言,通过结合使用其他的Web技术(如:脚本语言、公共网关接口、组件等),可以创造出功能强大的网页。因而,超级文本标记语言是万维网(Web)编程的基础,也就是说万维网是建立在超文本基础之上的。超级文本标记语言之所以称为超文本标记语言,是因为文本中包含了所谓“超级链接”点。 本篇文章给大家带来的内容是关于ECMAScript6中Promise是什么?有什么用?(附示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。刚学习完,有点粗略印象。整理记录一下以便后续学习补充,加深理解。 Promise是什么 Promise是构造函数,可以通过new来生成Promise对象。 Promise有什么用 目前我的感受是:更加方便来操作异步流程,更加明确直观的控制事件的流程以及可以链式调用 Promise特点 摘自ES6入门 Promise对象有以下两个特点。 通过几个简单例子理解它通过new构造一个简单的Promise对象 let p = new Promise((resolve, reject) => {});传入的两个参数是用来控制Promise对象的状态,我们打印一下p看一下它的状态: //resolve()
let p = new Promise((resolve, reject) => resolve("123")); //Promise {<resolved>: "123"}//reject()
let p = new Promise((resolve, reject) => reject("123")); //reject()后是返回一个失败状态的Promise,不需要用catch来捕获不写catch会报错
p.catch(data => console.log(data));
console.log(p); //Promise {<rejected>: "123"} 123提到了catch那就有还有一个then let p = new Promise((resolve, reject) => {
let n = Math.ceil(Math.random() * 10);
n > 5 ? resolve(n) : reject(n);
});
p.then(
data => console.log(data),
data => console.log(data),
)用catch代替,并捕获then的错误 let p = new Promise((resolve, reject) => {
resolve("yes")
});
p.then(
data => {console.log(data),console.log(a)}
).catch(data => console.log(data));
//yes
//ReferenceError: a is not defined因为then处理后返回的还是Promise对象,这样方便链式调用,then中都没有return,怎么会有Promise对象的呢? then或catch即使未显式指定返回值, 它们也总是自动包装一个新的fulfilled状态的promise对象。我们打印一下会发现: let p = new Promise((resolve, reject) => resolve("yes"));
p.then(data => Promise.resolve("第二个Promise")).then(data => console.log(data)); //第二个Promise可以看到 Promise.resolve(value | promise | thenable)创建Promise对象 Promise.resolve('f')
// 等价于
new Promise(resolve => resolve('f'))第二值得注意的是具有then方法的对象 let thenable = {
then :(resolve, reject) => resolve("thenable")
}
let p = Promise.resolve(thenable);
console.log(p);Promise对象状态由<pending>-><resolve> let p1 = new Promise((resolve, reject) => false); let p = Promise.resolve(p1); console.log(p); p状态和p1状态一致的 Promise.reject(value)创建Promise对象 const thenable = {
then(resolve, reject) {
reject('出错了');
}
};
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable)
})catch方法的参数不是reject抛出的“出错了”这个字符串,而是thenable对象。 Promise.all 将多个 Promise 实例,包装成一个新的 Promise 实例;const p = Promise.all([p1, p2, p3]); (1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。 (2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。 会等all中的对象全部执行完后将数组传入回调函数then中 let p = new Promise((resolve, reject) => setTimeout(() => resolve('p'),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve('p2'),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve('p3'),3000));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); // ["p", "p2", "p2"]let p = new Promise((resolve, reject) => resolve('p'));
let p1 = new Promise((resolve, reject) => reject('p2'));
let p2 = new Promise((resolve, reject) => resolve('p2'));
Promise.all([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); //p2Promise.race let p = new Promise((resolve, reject) => setTimeout(() => resolve('p'),1000));
let p1 = new Promise((resolve, reject) => setTimeout(() => resolve('p2'),2000));
let p2 = new Promise((resolve, reject) => setTimeout(() => resolve('p3'),3000));
Promise.race([p, p1, p2]).then(data => console.log(data)).catch(data => console.log(data)); //pPromise对象的回调函数与setTimeout的顺序问题 An event loop has one or more task queues. A task queue is an ordered
list of tasks, which are algorithms that are responsible for such work
as: events, parsing, callbacks, using a resource, reacting to DOM
manipulation…Each event loop has a microtask queue. A microtask is a
task that is originally to be queued on the microtask queue rather than a
task queue. setTimeout(function () {
console.log('three');
}, 0);
Promise.resolve().then(function () {
console.log('two');
});
console.log('one');
// one
// two
// three上面代码中,setTimeout(fn, 0)在下一轮“事件循环”开始时执行,Promise.resolve()在本轮“事件循环”结束时执行,console.log('one')则是立即执行,因此最先输出。 setTimeout(function() {
console.log(4)
}, 0);
new Promise(function(resolve) {
console.log(1);
for (var i = 0; i < 10000; i++) {
i == 9999 && resolve()
}
console.log(2);
}).then(function() {
console.log(5)
});
console.log(3); //1 2 3 5 4以上就是ECMAScript6中Promise是什么?有什么用?(附示例)的详细内容,更多请关注php中文网其它相关文章! 网站建设是一个广义的术语,涵盖了许多不同的技能和学科中所使用的生产和维护的网站。 |
温馨提示:喜欢本站的话,请收藏一下本站!