关于javascript:Symbol-Generator函数-Promise

123次阅读

共计 3025 个字符,预计需要花费 8 分钟才能阅读完成。

一:Symbol

1.1 根本应用

简略的说,Symbol 就是一个相对惟一的 key 值,相似之前 obj[‘key’]=’value’ 这种操作的字符串 ’key’,益处是相对不会反复,防止笼罩之前的值。

Symbol 是一个办法,会返回一个惟一的 symbol,能够带参数,比方:var sy=Symbol(‘sy-name’),不过这只是为了不便查看,加不加目前没有区别。

var sy1=Symbol(),sy2=Symbol();

console.log(sy1===sy2);//false

var obj={[sy1]:'这是数据一'};

obj[sy2]='这是数据二';

console.log(obj);//{Symbol(): "这是数据一", Symbol(): "这是数据二"}

1.2 有用的办法

  • Symbol.for(): 承受一个字符串作为参数,而后在全局搜寻有没有以改字符串作为名称的 Symbol 值,如果有就返回,没有就新建一个返回。留神:只有该办法建设的 Symbol 会注销在全局,Symbol() 办法建设的不会注销在全局
var sy1 = Symbol.for(),sy2 = Symbol.for();

console.log(sy1 === sy2);//true

var sy3 = Symbol.for('info1'),sy4 = Symbol.for('info1');

console.log(sy3 === sy4);//true

var sy5=Symbol('info2'),sy6 = Symbol.for('info2');

console.log(sy3 === sy6);//false

console.log(sy5 === sy6);//false
  • Symbol.keyFor()

该办法是配合下面的办法来应用的,承受一个 Symbol 作为参数,会在全局搜寻该 Symbol 对象,返回该对象名称,如果没有就返回 undefined。

二:Generator 函数

2.1 根本应用

定义函数名称时带一个 * 的函数就是 Generator 函数,外部的 yield 语句是特色,该函数的应用能够用上面的几条概括一下:

  • 调用 Generator 函数并不会立即 return 后果,而是在遇到第一个 yield 语句前停止下来,返回一个指针(权且这样称说);
  • 当前每次调用 yield 时候(具体看上面例子,直到遇到 yield 或 return 时进行继续执行),会返回 yield 数据,有点相似 return;
  • 返回的数据格式从上面的例子应该就明确了,没有 yield 或 return 语句会产生什么应该也明确了。
function *firstYieldFun(){

    yield '你好';

    yield '2007';

    return 'name:';

}

var fun=firstYieldFun();

console.log(fun.next());//{value: "你好", done: false}

console.log(fun.next());//{value: "2007", done: false}

console.log(fun.next());//{value: "name:", done: true}

console.log(fun.next());//{value: undefined, done: true}

console.log(fun.next());//{value: undefined, done: true}

简略的说,Generator 函数就是一个分段执行的函数,走走停停,yield 用来切割代码成一段段的,next() 办法用来启动执行下一段这个行为。

forEach 办法的参数是一个一般函数,Generator 函数不能够作为参数。

2.2 重要的阐明

  • yield 非凡应用

除了下面的例子 yield 独自成为一个语句,其还能够用于表达式,函数参数和赋值表达式的左边等。

须要留神的是,yield 要明确归属,用小括号包裹,小括号不是必须的,是在归属关系不明确的时候才是必须的,例如:console.log('My name is :'+(yield '你好 2007'))

  • next() 办法带参数时

yield 自身不会返回值,或者说是 undefined,不过 next() 办法如果带参数状况就不一样了,此时就会返回 yield 带的参数,如下例子阐明:

function* secondYieldFun() {console.log(yield '你好 2007');

}

var fun = secondYieldFun();

console.log(fun.next()); //{value: "你好 2007", done: false}

// 这是参数
console.log(fun.next('这是参数')); //{value: undefined, done: true}

三:Promise

3.1 根本应用

Promise 就是一个对象,有点相似注册事件的感觉,不过又不一样,你提前注册好胜利和失败当前应该走的门路,而后你本人依据理论状况决定是失败还是胜利,其实和回调没有实质的区别,就是写起来如同难看了些,上面的例子很明了。

var promise1 = new Promise(function(resolve, reject) {setTimeout(function() {if (false) {

            //Pending --> Resolved
            resolve('胜利了');

        } else {

            //Pending --> Rejected
            reject('失败了');

        }

    }, 5000);
});

promise1.then(function(value) {console.log('胜利:' + value);

}, function(error) {console.log('失败:' + error);

});

须要阐明一下的是,Promise 对象保障着三种状态:pending、Resolved 和 Rejected,就是进行中、胜利和失败的意思。

3.2 Promise.race() 和 Promise.all()

将多个 Promise 实例,包装成一个新的 Promise 实例。上面介绍的二个办法的参数如果不是对象的实例,就会先调用 Promise.resolve 办法变成对象的实例再传递进去。

let pro=Promise.race(Promise 对象的实例 1, Promise 对象的实例 2 [,Promise 对象的实例 N])

只有 promise 对象的实例中有一个率先扭转,率先扭转的那个的返回状态就会作为 pro 的状态返回,余下的会继续执行结束但不会扭转状态了。

let pro=Promise.all(Promise 对象的实例 1, Promise 对象的实例 2 [,Promise 对象的实例 N])

后果只有二种状况:

  • 全副胜利时,会期待全副执行完结,返回胜利;
  • 存在至多一个失败时,会在遇见第一个失败时候返回失败,余下的会继续执行结束但不会扭转状态了。
var pro1 = new Promise((resolve, reject) => setTimeout(() => resolve('第一条'), 3000));

var pro2 = new Promise((resolve, reject) => setTimeout(() => resolve('第二条'), 1000));

var proAll = Promise.all([pro1, pro2]);

proAll.then(val => console.log(val)); // ["第一条", "第二条"]

正文完
 0