当前位置: 首页 > news >正文

网站开发的条件公司网站建设价格

网站开发的条件,公司网站建设价格,庆阳做网站的公司,seo是什么职业合法吗【Javascript】 Promise 对象#xff08;一#xff09;-CSDN博客 Promise.all() Promise.all()方法用于将多个 Promise 实例#xff0c;包装成一个新的 Promise 实例。 const p Promise.all([p1, p2, p3]);上面代码中#xff0c;Promise.all()方法接受一个数组作为参数一-CSDN博客 Promise.all() Promise.all()方法用于将多个 Promise 实例包装成一个新的 Promise 实例。 const p Promise.all([p1, p2, p3]);上面代码中Promise.all()方法接受一个数组作为参数p1、p2、p3都是 Promise 实例如果不是就会先调用下面讲到的Promise.resolve方法将参数转为 Promise 实例再进一步处理。另外Promise.all()方法的参数可以不是数组但必须具有 Iterator 接口且返回的每个成员都是 Promise 实例。 p的状态由p1、p2、p3决定分成两种情况。 1只有p1、p2、p3的状态都变成fulfilledp的状态才会变成fulfilled此时p1、p2、p3的返回值组成一个数组传递给p的回调函数。 2只要p1、p2、p3之中有一个被rejectedp的状态就变成rejected此时第一个被reject的实例的返回值会传递给p的回调函数。 下面是一个具体的例子。 // 生成一个Promise对象的数组 const promises [2, 3, 5, 7, 11, 13].map(function (id) {return getJSON(/post/ id .json); });Promise.all(promises).then(function (posts) {// ... }).catch(function(reason){// ... });上面代码中promises是包含 6 个 Promise 实例的数组只有这 6 个实例的状态都变成fulfilled或者其中有一个变为rejected才会调用Promise.all方法后面的回调函数。 下面是另一个例子。 const databasePromise connectDatabase();const booksPromise databasePromise.then(findAllBooks);const userPromise databasePromise.then(getCurrentUser);Promise.all([booksPromise,userPromise ]) .then(([books, user]) pickTopRecommendations(books, user));上面代码中booksPromise和userPromise是两个异步操作只有等到它们的结果都返回了才会触发pickTopRecommendations这个回调函数。 注意如果作为参数的 Promise 实例自己定义了catch方法那么它一旦被rejected并不会触发Promise.all()的catch方法。 const p1 new Promise((resolve, reject) {resolve(hello); }) .then(result result) .catch(e e);const p2 new Promise((resolve, reject) {throw new Error(报错了); }) .then(result result) .catch(e e);Promise.all([p1, p2]) .then(result console.log(result)) .catch(e console.log(e)); // [hello, Error: 报错了]上面代码中p1会resolvedp2首先会rejected但是p2有自己的catch方法该方法返回的是一个新的 Promise 实例p2指向的实际上是这个实例。该实例执行完catch方法后也会变成resolved导致Promise.all()方法参数里面的两个实例都会resolved因此会调用then方法指定的回调函数而不会调用catch方法指定的回调函数。 如果p2没有自己的catch方法就会调用Promise.all()的catch方法。 const p1 new Promise((resolve, reject) {resolve(hello); }) .then(result result);const p2 new Promise((resolve, reject) {throw new Error(报错了); }) .then(result result);Promise.all([p1, p2]) .then(result console.log(result)) .catch(e console.log(e)); // Error: 报错了Promise.race() Promise.race()方法同样是将多个 Promise 实例包装成一个新的 Promise 实例。 const p Promise.race([p1, p2, p3]);上面代码中只要p1、p2、p3之中有一个实例率先改变状态p的状态就跟着改变。那个率先改变的 Promise 实例的返回值就传递给p的回调函数。 Promise.race()方法的参数与Promise.all()方法一样如果不是 Promise 实例就会先调用下面讲到的Promise.resolve()方法将参数转为 Promise 实例再进一步处理。 下面是一个例子如果指定时间内没有获得结果就将 Promise 的状态变为reject否则变为resolve。 const p Promise.race([fetch(/resource-that-may-take-a-while),new Promise(function (resolve, reject) {setTimeout(() reject(new Error(request timeout)), 5000)}) ]);p .then(console.log) .catch(console.error);上面代码中如果 5 秒之内fetch方法无法返回结果变量p的状态就会变为rejected从而触发catch方法指定的回调函数。 Promise.allSettled() 有时候我们希望等到一组异步操作都结束了不管每一个操作是成功还是失败再进行下一步操作。但是现有的 Promise 方法很难实现这个要求。 Promise.all()方法只适合所有异步操作都成功的情况如果有一个操作失败就无法满足要求。 const urls [url_1, url_2, url_3]; const requests urls.map(x fetch(x));try {await Promise.all(requests);console.log(所有请求都成功。); } catch {console.log(至少一个请求失败其他请求可能还没结束。); }上面示例中Promise.all()可以确定所有请求都成功了但是只要有一个请求失败它就会报错而不管另外的请求是否结束。 为了解决这个问题ES2020 引入了Promise.allSettled()方法用来确定一组异步操作是否都结束了不管成功或失败。所以它的名字叫做”Settled“包含了”fulfilled“和”rejected“两种情况。 Promise.allSettled()方法接受一个数组作为参数数组的每个成员都是一个 Promise 对象并返回一个新的 Promise 对象。只有等到参数数组的所有 Promise 对象都发生状态变更不管是fulfilled还是rejected返回的 Promise 对象才会发生状态变更。 const promises [fetch(/api-1),fetch(/api-2),fetch(/api-3), ];await Promise.allSettled(promises); removeLoadingIndicator();上面示例中数组promises包含了三个请求只有等到这三个请求都结束了不管请求成功还是失败removeLoadingIndicator()才会执行。 该方法返回的新的 Promise 实例一旦发生状态变更状态总是fulfilled不会变成rejected。状态变成fulfilled后它的回调函数会接收到一个数组作为参数该数组的每个成员对应前面数组的每个 Promise 对象。 const resolved Promise.resolve(42); const rejected Promise.reject(-1);const allSettledPromise Promise.allSettled([resolved, rejected]);allSettledPromise.then(function (results) {console.log(results); }); // [ // { status: fulfilled, value: 42 }, // { status: rejected, reason: -1 } // ]上面代码中Promise.allSettled()的返回值allSettledPromise状态只可能变成fulfilled。它的回调函数接收到的参数是数组results。该数组的每个成员都是一个对象对应传入Promise.allSettled()的数组里面的两个 Promise 对象。 results的每个成员是一个对象对象的格式是固定的对应异步操作的结果。 // 异步操作成功时 {status: fulfilled, value: value}// 异步操作失败时 {status: rejected, reason: reason}成员对象的status属性的值只可能是字符串fulfilled或字符串rejected用来区分异步操作是成功还是失败。如果是成功fulfilled对象会有value属性如果是失败rejected会有reason属性对应两种状态时前面异步操作的返回值。 下面是返回值的用法例子。 const promises [ fetch(index.html), fetch(https://does-not-exist/) ]; const results await Promise.allSettled(promises);// 过滤出成功的请求 const successfulPromises results.filter(p p.status fulfilled);// 过滤出失败的请求并输出原因 const errors results.filter(p p.status rejected).map(p p.reason);Promise.any() ES2021 引入了Promise.any()方法。该方法接受一组 Promise 实例作为参数包装成一个新的 Promise 实例返回。 Promise.any([fetch(https://v8.dev/).then(() home),fetch(https://v8.dev/blog).then(() blog),fetch(https://v8.dev/docs).then(() docs) ]).then((first) { // 只要有一个 fetch() 请求成功console.log(first); }).catch((error) { // 所有三个 fetch() 全部请求失败console.log(error); });只要参数实例有一个变成fulfilled状态包装实例就会变成fulfilled状态如果所有参数实例都变成rejected状态包装实例就会变成rejected状态。 Promise.any()跟Promise.race()方法很像只有一点不同就是Promise.any()不会因为某个 Promise 变成rejected状态而结束必须等到所有参数 Promise 变成rejected状态才会结束。 下面是Promise()与await命令结合使用的例子。 const promises [fetch(/endpoint-a).then(() a),fetch(/endpoint-b).then(() b),fetch(/endpoint-c).then(() c), ];try {const first await Promise.any(promises);console.log(first); } catch (error) {console.log(error); }上面代码中Promise.any()方法的参数数组包含三个 Promise 操作。其中只要有一个变成fulfilledPromise.any()返回的 Promise 对象就变成fulfilled。如果所有三个操作都变成rejected那么await命令就会抛出错误。 Promise.any()抛出的错误是一个 AggregateError 实例这个 AggregateError 实例对象的errors属性是一个数组包含了所有成员的错误。 下面是一个例子。 var resolved Promise.resolve(42); var rejected Promise.reject(-1); var alsoRejected Promise.reject(Infinity);Promise.any([resolved, rejected, alsoRejected]).then(function (result) {console.log(result); // 42 });Promise.any([rejected, alsoRejected]).catch(function (results) {console.log(results instanceof AggregateError); // trueconsole.log(results.errors); // [-1, Infinity] });Promise.resolve() 有时需要将现有对象转为 Promise 对象Promise.resolve()方法就起到这个作用。 const jsPromise Promise.resolve($.ajax(/whatever.json));上面代码将 jQuery 生成的deferred对象转为一个新的 Promise 对象。 Promise.resolve()等价于下面的写法。 Promise.resolve(foo) // 等价于 new Promise(resolve resolve(foo))Promise.resolve()方法的参数分成四种情况。 1参数是一个 Promise 实例 如果参数是 Promise 实例那么Promise.resolve将不做任何修改、原封不动地返回这个实例。 2参数是一个thenable对象 thenable对象指的是具有then方法的对象比如下面这个对象。 let thenable {then: function(resolve, reject) {resolve(42);} };Promise.resolve()方法会将这个对象转为 Promise 对象然后就立即执行thenable对象的then()方法。 let thenable {then: function(resolve, reject) {resolve(42);} };let p1 Promise.resolve(thenable); p1.then(function (value) {console.log(value); // 42 });上面代码中thenable对象的then()方法执行后对象p1的状态就变为resolved从而立即执行最后那个then()方法指定的回调函数输出42。 3参数不是具有then()方法的对象或根本就不是对象 如果参数是一个原始值或者是一个不具有then()方法的对象则Promise.resolve()方法返回一个新的 Promise 对象状态为resolved。 const p Promise.resolve(Hello);p.then(function (s) {console.log(s) }); // Hello上面代码生成一个新的 Promise 对象的实例p。由于字符串Hello不属于异步操作判断方法是字符串对象不具有 then 方法返回 Promise 实例的状态从一生成就是resolved所以回调函数会立即执行。Promise.resolve()方法的参数会同时传给回调函数。 4不带有任何参数 Promise.resolve()方法允许调用时不带参数直接返回一个resolved状态的 Promise 对象。 所以如果希望得到一个 Promise 对象比较方便的方法就是直接调用Promise.resolve()方法。 const p Promise.resolve();p.then(function () {// ... });上面代码的变量p就是一个 Promise 对象。 需要注意的是立即resolve()的 Promise 对象是在本轮“事件循环”event loop的结束时执行而不是在下一轮“事件循环”的开始时。 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)则是立即执行因此最先输出。 Promise.reject() Promise.reject(reason)方法也会返回一个新的 Promise 实例该实例的状态为rejected。 const p Promise.reject(出错了); // 等同于 const p new Promise((resolve, reject) reject(出错了))p.then(null, function (s) {console.log(s) }); // 出错了上面代码生成一个 Promise 对象的实例p状态为rejected回调函数会立即执行。 Promise.reject()方法的参数会原封不动地作为reject的理由变成后续方法的参数。 Promise.reject(出错了) .catch(e {console.log(e 出错了) }) // true上面代码中Promise.reject()方法的参数是一个字符串后面catch()方法的参数e就是这个字符串。 Promise.try() 实际开发中经常遇到一种情况不知道或者不想区分函数f是同步函数还是异步操作但是想用 Promise 来处理它。因为这样就可以不管f是否包含异步操作都用then方法指定下一步流程用catch方法处理f抛出的错误。一般就会采用下面的写法。 Promise.resolve().then(f)上面的写法有一个缺点就是如果f是同步函数那么它会在本轮事件循环的末尾执行。 const f () console.log(now); Promise.resolve().then(f); console.log(next); // next // now上面代码中函数f是同步的但是用 Promise 包装了以后就变成异步执行了。 那么有没有一种方法让同步函数同步执行异步函数异步执行并且让它们具有统一的 API 呢回答是可以的并且还有两种写法。第一种写法是用async函数来写。 const f () console.log(now); (async () f())(); console.log(next); // now // next上面代码中第二行是一个立即执行的匿名函数会立即执行里面的async函数因此如果f是同步的就会得到同步的结果如果f是异步的就可以用then指定下一步就像下面的写法。 (async () f())() .then(...)需要注意的是async () f()会吃掉f()抛出的错误。所以如果想捕获错误要使用promise.catch方法。 (async () f())() .then(...) .catch(...)第二种写法是使用new Promise()。 const f () console.log(now); (() new Promise(resolve resolve(f())) )(); console.log(next); // now // next上面代码也是使用立即执行的匿名函数执行new Promise()。这种情况下同步函数也是同步执行的。 鉴于这是一个很常见的需求所以现在有一个提案提供Promise.try方法替代上面的写法。 const f () console.log(now); Promise.try(f); console.log(next); // now // next事实上Promise.try存在已久Promise 库Bluebird、Q和when早就提供了这个方法。 由于Promise.try为所有操作提供了统一的处理机制所以如果想用then方法管理流程最好都用Promise.try包装一下。这样有许多好处其中一点就是可以更好地管理异常。 function getUsername(userId) {return database.users.get({id: userId}).then(function(user) {return user.name;}); }上面代码中database.users.get()返回一个 Promise 对象如果抛出异步错误可以用catch方法捕获就像下面这样写。 database.users.get({id: userId}) .then(...) .catch(...)但是database.users.get()可能还会抛出同步错误比如数据库连接错误具体要看实现方法这时你就不得不用try...catch去捕获。 try {database.users.get({id: userId}).then(...).catch(...) } catch (e) {// ... }上面这样的写法就很笨拙了这时就可以统一用promise.catch()捕获所有同步和异步的错误。 Promise.try(() database.users.get({id: userId})).then(...).catch(...)事实上Promise.try就是模拟try代码块就像promise.catch模拟的是catch代码块。
http://www.hkea.cn/news/14471395/

相关文章:

  • 网站终端制作搜索排名提升
  • 服务器与网站c 在线视频网站开发
  • 只用js可以做网站吗网创是什么
  • 重庆seo网站哪家好做展示网站要恋用什么程序
  • 峡山网站建设wordpress keyword
  • 做电影网站需多大的空间dux2.0支持Wordpress
  • 江门市网站建设 熊掌号关于建设企业网站的请示
  • 分级会员管理系统网站开发wordpress调用文章内容图片
  • 保定手机网站让wordpress自检
  • 网站建设翻译插件安安互联怎么上传网站
  • 做cpa用什么类型的网站好网页推广方案
  • 做现金贷的网站有哪些饿了吗外卖网站怎么做
  • 物流如何做网站装修效果图素材网
  • 做网站ftp网站建设从哪入手
  • 在线捐款网站开发网站效果图设计方案
  • 自助建站平台源码wordpress纯代码屏蔽谷歌字体
  • 设计网站接单wordpress漫画小说
  • 怎样建手机网站深圳营销策划公司
  • 网站制作费一般多少不同网站相似的页面百度不收录吗
  • 哪里有做网站的公司专门做民宿的网站
  • 直播是网站怎么做网站费用构成
  • 制作网站的最新软件是什么查找人网站 优帮云
  • 学校门户网站建设工作做网站找个人还是公司
  • 唐河网站制作打开百度首页
  • 网站logo素材互联网排名前100的公司
  • 西宁网站建设最好的公司北京市公共资源交易服务平台
  • 做网站资源管理是高校网站模板
  • wordpress多站点批量添加wordpress不用主题
  • 龙岩网站建惠州市网站开发
  • 国外论文类网站有哪些长春专业网站建设公司