资讯专栏INFORMATION COLUMN

Promise理解

jifei / 3259人阅读

摘要:参数数组中的任何一个对象如果变为或者的话,该函数就会返回,并使用这个对象的值进行或者。并没有执行进入后,依旧会执行并不会被住。发生,不会执行,会直接到中,由于在和后面没有处理了,因此在这两个中如果出现异常的话将不会被捕获只会出现以下

ES6 Generator/Promise Generator
node -harmony app.js (harmony 告诉Node使用ES6来运行)
yield(不能再普通函数中,只能在function* 这样的Generator函数中,拥有next方法)

next 方法的参数表示上一个 yield 语句的返回值,所以第一次使用 next 方法时,不能带有参数。V8 引擎直接忽略第一次使用 next 方法时的参数,只有从第二次使用 next 方法开始,参数才是有效的。

function* ticketGenerator() {
   yield 1;
    yield 2;
    yield 3;
    //yield,return有些像,都能返回紧跟语句后面的表达式的值,
    //区别是每次遇到yield,函数是暂停执行,下一次再从该位置继续向后执行
    //而return不具备位置记忆功能,只能执行一次,所以一个函数只能返回一个值
    return 4; //yield 4; {value: 4, done: false}
}

const takeANumber = ticketGenerator();

var i = 0;
while (i < 4) {
    i++;
    console.log(takeANumber.next())
}
// { value: 1, done: false }
// { value: 2, done: false }
// { value: 3, done: false }
// { value: 4, done: true }

//for ... of依次显示yield的值,一旦next方法返回的对象的done为
//true, 循环就会终止
for (var v of ticketGenerator()) {
    console.log(v);
}

进阶:

function* foo(x) {
  var y = 2 * (yield (x + 1));
  var z = yield (y / 3);
  return (x + y + z);
}

var it = foo(5);

it.next()
// { value:6, done:false }
it.next(12)
// { value:8, done:false }
it.next(13)
// { value:42, done:true }

如果 yield 命令后面跟的是一个遍历器,需要在 yield 命令后面加上星号,表明它返回的是一个遍历器。这被称为 yield语句。*

Promise(解决异步操作的对象)

pending - The initial state of a promise.

fulfilled - The state of a promise representing a successful operation.

rejected - The state of a promise representing a failed operation.

Promise库

bluebird

Q

then.js

es6-promise

ypromise

async

native-promise-only

API:
new Promise((resolve, reject) => {})
Static Methods:
Promise.resolve(value) --返回一个使用接收到的值进行了resolve的新的promise对象
Promise.reject(value) --返回一个使用接收到的值进行了reject的新的promise对象
Promise.all(array)
生成并返回一个新的promise对象。
当这个数组里的所有promise对象全部变为resolve或reject状态的时候,它才会去调用 .then 方法。

eg: 
Promise.all([Promise.resolve("a"), "b", Promise.resolve("c")])
.then(function (res) {
  assert(res[0] === "a")
  assert(res[1] === "b")
  assert(res[2] === "c")
})

Promise.race(array)
生成并返回一个新的promise对象。
参数 promise 数组中的任何一个promise对象如果变为resolve或者reject的话, 该函数就会返回,并使用这个promise对象的值进行resolve或者reject。
eg:
var p1 = Promise.resolve(1),
    p2 = Promise.resolve(2),
    p3 = Promise.resolve(3);
Promise.race([p1, p2, p3]).then(function (value) {
    console.log(value);  // 1
});
Prototype Methods:
Promise.then(onFulfilled, onRejected)
Promise.catch(onRejected)

Example:

function taskA() {
    console.log("Task A");
    throw new Error("throw Error Task A")
}
function taskB() {
    console.log("Task B");
}
function onRejected(error) {
    console.log("Catch Error: ", error);
}
function finalTask() {
    console.log("Final Task");
    throw new Error("throw Error Final task")
}

var promiseB = new Promise((resolve, reject) => reject(new Error("error msg")))
promiseB
.then(success => console.log("onfulfilled ", success), err => console.log("onRejected ", err))
.then(taskA)
.then(taskB)
.catch(onRejected)
.then(finalTask);

//output: 
//onRejected Error: error msg
//Task A 
//Catch Error: Error: throw Error Task A ---并没有执行task B
//Final Task

promiseB 进入onRejected callback后,依旧会执行Task A, 并不会被 onRejected catch住。
taskA 发生error,不会执行taskB,会直接到 onRejected -> finalTask

promise chain中,由于在 onRejected 和 finalTask 后面没有 catch 处理了,因此在这两个Task中如果出现异常的话将不会被捕获,只会出现以下warning:

(node:83039) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 2): Error: throw Error Final task

(node:83039) DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/89567.html

相关文章

  • JavaScript 异步

    摘要:从最开始的到封装后的都在试图解决异步编程过程中的问题。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。写一个符合规范并可配合使用的写一个符合规范并可配合使用的理解的工作原理采用回调函数来处理异步编程。 JavaScript怎么使用循环代替(异步)递归 问题描述 在开发过程中,遇到一个需求:在系统初始化时通过http获取一个第三方服务器端的列表,第三方服务器提供了一个接口,可通过...

    tuniutech 评论0 收藏0
  • ES6-7

    摘要:的翻译文档由的维护很多人说,阮老师已经有一本关于的书了入门,觉得看看这本书就足够了。前端的异步解决方案之和异步编程模式在前端开发过程中,显得越来越重要。为了让编程更美好,我们就需要引入来降低异步编程的复杂性。 JavaScript Promise 迷你书(中文版) 超详细介绍promise的gitbook,看完再不会promise...... 本书的目的是以目前还在制定中的ECMASc...

    mudiyouyou 评论0 收藏0
  • 理解 Javascript 中的 Promise

    摘要:理解承诺有两个部分。如果异步操作成功,则通过的创建者调用函数返回预期结果,同样,如果出现意外错误,则通过调用函数传递错误具体信息。这将与理解对象密切相关。这个函数将创建一个,该将在到秒之间的随机数秒后执行或。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...

    paulli3 评论0 收藏0
  • 理解 Javascript 中的 Promise

    摘要:理解承诺有两个部分。如果异步操作成功,则通过的创建者调用函数返回预期结果,同样,如果出现意外错误,则通过调用函数传递错误具体信息。这将与理解对象密切相关。这个函数将创建一个,该将在到秒之间的随机数秒后执行或。 想阅读更多优质文章请猛戳GitHub博客,一年百来篇优质文章等着你! showImg(https://segmentfault.com/img/bVbkNvF?w=1280&h=...

    chaos_G 评论0 收藏0
  • Promise理解与实现

    摘要:对象设置初始状态默认为等待状态用数组来保存成功函数设置为成功状态设置为失败状态调用回调函数增加方法根据状态执行成功失败方法执行成功方法执行失败方法将成功失败方法保存在数组里 promise理解 promise的意思是承诺。承诺理解为某个时候一些条件满足后,会兑现一件事情。 //为了方便理解我编一个小故事 //先假装我有一个女朋友 //她承诺如果她爸妈不回来就给我就可以去帮她修电脑 否则...

    hlcc 评论0 收藏0
  • Promise理解

    摘要:中就是一个构造函数函数也是对象为什么需要多个嵌套的异步操作,如果直接用方式,会导致的出现使得异步操作更加规范,更加统一。的方法构造函数构造函数用于生成对象,函数在构造函数执行时同步执行。 什么是Promise? 含以上:抽象异步操作的工具。javascript中:Promise就是一个构造函数(函数也是对象) 为什么需要Promise? 1.多个嵌套的异步操作,如果直接用callbac...

    Binguner 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<