- 使用 Spring Initializr 创建 Spring Boot 应用程序
- 在Spring Boot中配置Cassandra
- 在 Spring Boot 上配置 Tomcat 连接池
- 将Camel消息路由到嵌入WildFly的Artemis上
Promise.xx 表示类方法
Promise.prototype.xxx 表示实例方法
语法:new Promise(executor)
then()
方法返回一个 Promise,它最多需要两个参数,Promise 成功和失败的回调函数
// 语法 onFulfilled 【执行成功的回调】 onRejected 【执行失败的回调】
p.then(onFulfilled[, onRejected]);
p.then(value => {
// fulfillment
}, reason => {
// rejection
});
catch()
方法返回的也是一个 Promise,则意味着改程序处理被拒绝了
// Promise.prototype.catch()
// 出异常案例
let p = new Promise((resolve, reject) => {
reject("error");
});
p.catch(reason => {
console.log(reason); // error
});
resolve()
方法返回一个给定解析后 Promise 对象,resolve 里面如果传递一个 Promise 对象,那么传递的也是 Promise 对象,依次类推
const promise1 = Promise.resolve(123);
promise1.then((value) => {
console.log(value);
// expected output: 123
});
更多示例:传送门
reject()
方法返回一个带有拒绝原因的Promise
对象,参数即为被拒绝的原因
// 还记得前面是怎么写的吗? then 传入的是个 executor
Promise.reject(new Error('fail')).then(function() {
// not called
}, function(error) {
console.error(error); // Stacktrace
});
Promise.all()
方法接收一个promise的i terable 类型(注:Array,Map,Set都属于ES6的iterable类型)的输入,并且只返回一个Promise
实例
Promise.all(iterable); // Promise 传入的是可迭代的对象(Promise)
简单来说,可以一次接收多个 Promise,只会返回一个 Promise 实例,但是 Promise 是有两种返回情况的
成功的案例
let p = new Promise((resolve, reject) => {
resolve("OK");
});
let p2 = Promise.resolve("Success");
let p3 = Promise.resolve("Nice");
const result = Promise.all([p,p2,3]);
console.log(result);
/**
Promise
[[Prototype]]: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: Array(3)
0: "OK"
1: "Success"
2: "Nice"
length: 3
[[Prototype]]: Array(0)
*/
失败的案例
let p = new Promise((resolve, reject) => {
resolve("OK");
});
let p2 = Promise.reject("Error");
let p3 = Promise.resolve("Nice");
const result = Promise.all([p,p2,p3]);
console.log(result);
/**
Promise {<pending>}
[[Prototype]]: Promise
[[PromiseState]]: "rejected"
[[PromiseResult]]: "Error"
*/
划重点!当你有多个异步任务执行时,需要有某个任务失败就立刻停止时,就可以使用 Promise.all()
用官方的话说,``Promise.all()更适合彼此相互依赖或者在其中任何一个
reject`时立即结束
前面有 Promise.all()
,现在又有了 Promise.allSettled()
,该对象方法和 Promise.all() 的使用方式是一样的,但是它的作用和 Promise.all()
不一样
常常用于你想知道每个 Promise 的执行结果
let p = new Promise((resolve, reject) => {
resolve("OK");
});
let p2 = Promise.reject("Error");
let p3 = Promise.resolve("Nice");
// const result = Promise.all([p,p2,p3]);
Promise.allSettled([p,p2,p3]).then((results) => {
results.forEach(element => {
console.log(element); // {status:'fullfilled or rejected', value: 'value or reasonn'}
});
})
Warning !!!Promise.any()
当前时实验性功能,并不被所有游览器支持
这个方法用于返回第一个成功的 promise
。只要有一个 promise
成功此方法就会终止,它不会等待其他的 promise
全部完成。
语法:
Promise.any(iterable); // iterable 一个可迭代的对象, 例如 Array,Set,Map 等。
返回值:
promise
,则返回一个 异步完成 (asynchronously resolved)的 Promise。promise
变成成功(resolve)状态,或者其中的所有的 promises
都失败,那么返回的 promise
就会 异步地(当调用栈为空时) 变成成功/失败(resolved/reject)状态。看个实例吧!
// 返回第一个成功的案例
const pErr = new Promise((resolve, reject) => {
reject("总是失败");
});
const pSlow = new Promise((resolve, reject) => {
setTimeout(resolve, 500, "最终完成");
});
const pFast = new Promise((resolve, reject) => {
setTimeout(resolve, 100, "很快完成");
});
Promise.any([pErr, pSlow, pFast]).then((value) => {
console.log(value);// "很快完成"
// pFast fulfils first
})
// 没有成功的案例,则抛出异常
const pErr = new Promise((resolve, reject) => {
reject('总是失败');
});
Promise.any([pErr]).catch((err) => {
console.log(err); // "AggregateError: No Promise in Promise.any was resolved"
})
Promise.race(iterable)
方法返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝。
简言之,也就是说只要有一个成功 或者 失败,就会返回第一个结果,如果数组为空
语法
Promise.race(iterable); // iterable 是一个可迭代对象 Array,Set,Map 等
示例:
const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 500, 'one');
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 100, 'two');
});
Promise.race([promise1, promise2]).then((value) => {
console.log(value);
// Both resolve, but promise2 is faster
});
// expected output: "two"
finally()
方法返回一个Promise
。在promise结束时,无论结果是fulfilled或者是rejected,都会执行指定的回调函数。这为在Promise
是否成功完成后都需要执行的代码提供了一种方式。
这避免了同样的语句需要在then()
和catch()
中各写一次的情况。
语法:
p.finally(onFinally);
p.finally(function() {
// 返回状态为(resolved 或 rejected)
});
示例:
let isLoading = true;
fetch(myRequest).then(function(response) {
var contentType = response.headers.get("content-type");
if(contentType && contentType.includes("application/json")) {
return response.json();
}
throw new TypeError("Oops, we haven't got JSON!");
})
.then(function(json) { /* process your JSON further */ })
.catch(function(error) { console.log(error); })
.finally(function() { isLoading = false; });
let p = new Promise((resolve, reject) => {
console.log("aaa");
});
console.log("bbb");
// aaa
// bbb
《Gorit 带你学全栈 — JavaScript 高级应用(第二弹)》
我不明白 MDN javascript 语法文档中所有这些括号的含义。 例如,https://developer.mozilla.org/en-US/docs/Web/JavaScript/Refer
我正在关注MDN's Object Building Practice tutorial ,尝试使用 ES6 类声明来完成本教程。 我的程序中的弹跳球移动速度比教程大纲快得多。我已经设置了新创建的 B
我正在从 MDN 学习 CSS,我遇到了一些我无法理解的东西。下面的链接提到了“在下面的例子中,祖先 div(框一)是相对定位的(所以它变成最近定位的祖先)和盒子二绝对定位:“但我无法弄清楚盒子一是盒
我正在尝试安装一个附加组件,但它显示无法安装 oneextension,因为它与 Firefox 11 不兼容,但它是(我编写的)。 这是安装.rdf onextension@s
MDN(Mozilla Developer Network)网站如何更改上下文菜单? 例如,this page . 我以为他们创建了整个上下文菜单,以便在触发上下文菜单事件时调用它,但这似乎有点疯狂。
我关注了MDN's webRTC still photo capture在我自己的程序中。两个月前效果很好。今天,在尝试同一个程序时,我发现无法显示来自网络摄像头的视频输入。事实上,MDN提供的dem
在 Mozilla 开发者网络页面上,有一个示例,您可以在 getImageData() 的帮助下创建颜色选择器。您可以在https://developer.mozilla.org/en-US/doc
有人可以详细解释一下这个片段吗 var names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']; var countedNames = names.red
伙计们,我想了解为什么 call 真的有效,我是面向对象的 java 脚本、this 关键字和 call 等函数的新手。 我在一个在线程序中找到了下面一行: this.tabs = [].slice.
所以我正在查看 JavaScript MDN 重新介绍教程,并谈到了浮点不精确这一点。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/
关于 MDN topic for closures,他们将此示例作为“真实世界”应用程序展示。 body { font-family: Helvetica, Arial, sans
我正在尝试来自 Mozilla 开发者网络 ( https://developer.mozilla.org/en-US/docs/Web/JavaScript/A_re-introduction_to
我正在 MDN 网站上阅读 JavaScript 重新介绍,并在数组部分看到了这个示例: for (var i = 0, item; item = a[i++];){ // Do somethi
我在 MDN CSS 上看到以下新闻元素主页: Gecko's support of flexible boxes has been adapted to match a recent specifi
我在web上做了一点工作,有时候要回过头去看看MDN里的一些属性或者方法,但是在浏览器支持部分发现了一些看不懂的数字,有希望了在这里得到一些帮助。 我知道浏览器中的绿色框表示它支持它,但我在其中看到一
这个问题在这里已经有了答案: How to interpret function parameters in software and language documentation? (4 个答案)
这显然不是这种情况,因为每个元素都可以有自己的默认值。 看这里: https://developer.mozilla.org/en-US/docs/Web/CSS/display Initial va
我在 MDN CSS 上看到以下新闻元素主页: Gecko's support of flexible boxes has been adapted to match a recent specifi
我已阅读 the MDN page on the "Object.is" method .它为不提供此方法的浏览器提供了替代代码: if (!Object.is) { Object.is =
据我所知 JavaScript,基于原型(prototype)而不是类的 OOP 不考虑接口(interface),而是依赖于鸭子类型。 然而,我经常可以在 MDN 在线文档中看到一些描述为“接口(i
我是一名优秀的程序员,十分优秀!