一. Promise是什么?

Promise是一种异步操作的解决方案,将写法复杂的传统的回调函数和监听事件的异步操作,用同步代码的形式表达出来。

避免了多级异步操作的回调函数嵌套。

Promise最早是一个函数库,现在已经被ES6写入标准用法。

Promise是一种构造函数。

Promise实例创建后会立即执行。

  1. new Promise((resolve,reject)=> { // resolve,reject是形式参数,可以是任意写法,如(res, rej),默认第一个参数实现的是resolve功能;第二个参数实现的是reject功能。
  2. console.log("1");
  3. resolve("success")
  4. });
  5. console.log("2");
  6. // 执行结果
  7. 1
  8. 2

创建实例如下:

  1. //构造函数传参格式固定,就是函数加(resolve,reject)的参数,这是规定!!
  2. const myPromise = new Promise(function(resolve, reject){
  3. //自己需要实现的异步操作的内容
  4. ......
  5. ......
  6. if(成功) resolve(value);
  7. // resolve是js引擎提供定的成功后调用的函数,作用就是手动将该promise的状态由
  8. // pending(未完成)变为fulfilled(异步操作成功),然后立即触发then中的成功回调函数
  9. // value值是异步操作的结果,要传给后面的回调函数的值
  10. // 值的内容可以根据业务需求自己定;可以是值(普通对象,函数,字符,数字等)也可以是Promise对象
  11. else reject(new Error);
  12. // reject也是js引擎提供的失败后调用的函数,作用就是手动将状态由pending变为
  13. // rejected(异步操作失败),参数是抛出的异常。然后才能触发then中的错误回调函数或者catch中的回调函数
  14. })

 Promise的参数函数

  1. new Promise(function(resolve, reject){
  2. //....
  3. })

参数函数的resolve方法除了可以返回数据处理结果,还可以返回一个promise实例,

当返回promise实例的时候(resolve(promiseObj)),当前实例的状态无效,状态以参数实例(promiseObj)的状态为准。

返回的结果也以参数实例的返回结果为准。

示例:

  1. // 将实例p1作为p2的resolve返回参数
  2. const p1 = new Promise(function(resolve, reject){
  3. setTimeout(() => resolve("success"), 2000);
  4. });
  5. const p2 = new Promise(function(resolve, reject){
  6. setTimeout(() => resolve(p1), 1000); // p2的状态由p1决定
  7. });
  8. p2.then(function(data) {
  9. console.log(data); // success 2秒后打印p1的返回结果;说明then方法在状态改变后被触发。
  10. }, function() {
  11. }).catch(err => console.log(err))

resolve()不同于return, resolve()执行完成后后面的代码还会执行。

  1. new Promise((resolve,reject)=> {
  2. resolve("success");
  3. console.log("1"); //会打印
  4. });
  5. // 一般状态改变后的操作放在then回调函数中
  6. // 所以最好写成
  7. new Promise((resolve,reject)=> {
  8. return resolve("success");
  9. console.log("1"); //不再执行,最好不要在状态改变后添加操作
  10. });

二、Promise的实例方法

1. Promise.prototype.then()

then方法是Promise构造函数原型对象上的方法。

作用: 为实例状态改变时添加回调函数(相当于实例状态变化的监听函数)。

1)then方法接受两个回调函数作为参数,第一个函数是实例状态变为resolved(fulfilled)时的回调函数;

第二个函数是实例状态变为rejected时的回调函数。

  1. myPromise.then(function(value){
  2.   // 前面实例中resolve方法执行后触发该方法,即状态为fulfilled(resolved)状态时触发的回调函数
  3. // value值就是resolve的参数值
  4. },function(err) {
  5. // 前面实例中reject方法执行后会触发该方法,即状态为rejected时
  6. })

2)then方法返回一个新的Promise实例,所以可以采用链式写法;

then方法的第一个回调函数的返回值,即return的值作为下一个then方法里面的函数传参。

如果返回值是非Promise对象,会触发下一个then方法的第一个回调函数, 并且返回值作为回调函数的参数;

  1. const p1 = new Promise(function(resolve, reject) {
  2. resolve("success")
  3. })
  4. function fn() { return 5 } // 不论返回值是什么,返回结果结果都是下个then方法的第一个函数的参数,即使return new Error()
  5. p1.then(fn).then(
  6. result => console.log("1-->",result), //1-->5 如果fn返回new Error('fail'),则1-->Error: fail
  7. err => console.log('err-->',err) // 不执行
  8. )

如果前一个then方法返回值是promise对象,则程序会等待该promise对象的状态发生变化(resolved或rejected)时触发下一个then方法。

  1. const p1 = new Promise(function(resolve, reject) {
  2. resolve("success")
  3. })
  4. const p2 = new Promise(function(resolve, reject) {
  5. reject(new Error("p2"))
  6. })
  7. function fn() {
  8. return p2; // 返回Promise对象;
  9. }
  10. p1.then(fn).then(
  11. result => console.log('1-->',result), // 不执行
  12. err => console.log('err-->',err) // err-->Error: p2
  13. )

3)then方法rejected状态具有传递性,即如果实例调用reject(),则在所有的then方法的第二个函数中都能取到reject返回的值。

如果确实发生错误,则会执行最近的then方法的第二个回调函数,之后的错误回调函数都不再执行

  1. new Promise(fn)
  2. .then(f1) // 省略了rejected状态的回调函数,但是实际运行的时候还是会默认调用该then方法
  3. .then(f2)
  4. .then(f3)
  5. .then(f4, r1) // 这种写法不好,最好在最后使用catch方法
    .then(f4, r2)
  6. // 如果promise实例状态为rejected, 那么f1,f2,f3,f4都不会执行,但是r1执行,因为报错具有传递性。但是fulfilled状态的话,只能触发最近的成功回调
    // r2不执行,错误相当于被r2捕获

4) 如确认then方法中回调函数的返回值问题

  1. const p1 = new Promise(function(resolve, reject) {
  2. resolve("success")
  3. })
  4. function fn() {
  5. return 5;
  6. }
  7. p1.then(fn()).then(result => console.log('1',result));// "success" .then(fn)相当于then(5),忽略该then方法
  8. p1.then(fn).then(result => console.log('2',result)); //
  9. p1.then(function(){fn()}).then(result => console.log('3',result)); // undefined
  10. p1.then(function(){return fn()}).then(result => console.log('4',result)); //

5) then方法中的回调函数是异步任务,是微任务;诸如setTimeout是宏任务;

微任务加入本轮事件循环最下面;宏任务加入下一轮事件循环。因为主栈的任务也属于宏任务。

  1. setTimeout(() => console.log('1'),0);
  2. new Promise((resolve,reject)=> resolve(1)).then(() => console.log('2'))
  3. console.log('3');
  4. // 执行结果如下:
  5. 3
  6. 2
  7. 1

2. Promise.prototype.catch()

Promise原型上的catch方法,相当于.then(null/undefined, () => {}),所以返回的也是promise,后面还可以跟then或者catch,只在rejected状态触发。

1. 它可以捕获所有之前执行的promise中的错误

最好所有的promise都在最后使用catch方法,不要在then方法中写第二个回调函数

  1. myPromise.then((val) => {
  2. throw new Error("failed");
  3. }).then((val) => {
  4. // TODO
  5. }).catch((err) => {
    console.log(err); // Error: failed 捕获内部异常
  6. })

2. 在promise实例中,throw异常发生在resolve()之后, 抛出异常被忽略。

因为resolve之后,状态改变后永久保留该状态,不能再次改变。throw本质上是将状态修改为rejected。

  1. new Promise((resolve,reject)=> {
  2. resolve('ok');
  3. throw new Error('ok');
  4. }).then((data) => console.log('data-->',data)) // data-->ok
  5. .catch(err => console.log('err-->',err)); // 不执行;抛出异常被忽略
  6.  
  7. // 执行结果如下:
  8. data-->ok
  9.  
  10. // throw new Error('ok') 相当于
  11. new Promise((resolve,reject)=> {
  12. resolve('ok'); // 状态已经改变;后面本质也是修改状态;Promise状态改变后不再变化。
  13. try {
  14. throw new Error('ok');
  15. }catch (err) { //也说明了promise内部异常不会影响外部
  16. reject(err);
  17. }
  18. }).then((data) => console.log('data-->',data)) // data-->ok
  19. .catch(err => console.log('err-->',err)); // 不执行;抛出异常被忽略

如果抛出异常的位置在resolve方法后且在一个异步任务中,如setTimeout中,则在"下一轮"事件循环触发,此时promise已经执行完成。

因为then方法是微任务,比setTimeout先执行。在promise外抛出异常。

  1. const promise = new Promise(function (resolve, reject) {
  2. resolve('ok');
  3. setTimeout(function () { throw new Error('外部错误') }, 0);
  4. });
  5. promise.then(
  6. (data) => console.log('data-->',data)
  7. ).catch(err => console.log('err-->',err);
  8. // 运行结果如下:
  9. data-->ok
  10. Uncaught Error: 外部错误

3. Promise内部抛出异常后,即使不捕获也不会导致代码的终止运行。

即Promise内部的异常只在Promise内部。

  1. new Promise((resolve,reject)=> {
  2. throw new Error("err")
  3. // 相当于
  4. try {
  5. throw new Error("err")
  6. } catch(err) {
  7. reject(err)
  8. }
  9. }); // 错误不会终止代码
  10. console.log("会执行");
  11. // 执行结果如下;错误信息会打印
  12. "会执行"
  13. Uncaught (in promise) Error: err

4. catch方法返回一个promise, 且将状态由rejected变为resolved。catch方法的返回值将作为后续回调函数的参数。

所以后面可以接着调用then方法。

  1. const promise = new Promise(function (resolve, reject) {
  2. throw new Error("错误")
  3. });
  4. promise
  5. .then(data => console.log('data-->',data))
  6. .catch(err => {
    console.log('Caught err-->',err);
    return err; // 相当于resolve(err)
    }).then((a) => console.log('go on-->',a));
  7. // 运行结果如下:
  8. Caught err-->Error: 错误
  9. go on-->Error: 错误

3. Promise.prototype.finally()

不管状态(不能是pending)如何,都会执行的方法。语法:

  1. new Promise((resolve,reject) => {
  2. // 状态修改为resolved或者rejected
  3. }).finally(() => {...} )

finally方法最后返回一个promise实例,回调函数不接受任何值,return方法也被忽略。

但是会默认返回之前的实例对象传递的参数。

本质上,finally也是then的特例。

  1. Promise.prototype.finally = function(callback) {
  2. const P = this.constructor;
  3. return this.then(
  4. (value) => P.resolve(callback()).then(() => value),
  5. (reason) => P.resolve(callback()).then(() =>{ throw reason})
  6. )
  7. }

示例:

  1. const p = new Promise((resolve,reject) => {
  2. resolve(2)
  3. }).finally((data) => {
  4. console.log(data); //undefined 不接受任何参数
  5. return 5;
  6. }).then(after => {
  7. console.log(after); // 2,之前的参数
  8. });

应用:

如处理文件完成后,不论成功与否都关闭文件。

三. 静态方法

1.Promise.resolve()

该方法将对象或者非对象转为resolved(fulfilled)状态的promise对象。语法如下:

  1. Promise.resolve(data);
  2. // 相当于;
  3. new Promise(function(resolve, reject){
  4. resolve(data);
  5. })

1. 没有参数时

直接返回一个resolve状态的promise对象。then方法会立即执行。

  1. Promise.resolve().then(
  2. result => console.log(result); // undefined
  3. )

2. 参数是一个promise对象,不做任何处理

返回参数对象自身;此时和new Promise的写法运行结果不同。

  1. const p = Promise.resolve();
  2. const p1 = Promise.resolve(p); //就是p
  3. const p2 = new Promise(res => res(p)); //新建一个对象,对象状态依赖p
  4. // res(p)可以看作 await p; await fulfilled;
  5.  
  6. // 首先;p1 === p; p2!===p
  7. console.log(p === p1); // true
  8. console.log(p === p2); // false
  9. /******第一种情况***********/
  10. p1.then(() => {
  11. console.log('p1-1');
  12. }).then(() => {
  13. console.log('p1-2');
  14. })
  15. p.then(() => {
  16. console.log('p-1');
  17. }).then(() => {
  18. console.log('p-2');
  19. })
  20. // 运行结果如下:
  21. p1-1
  22. p-1
  23. p1-2
  24. p-2
  25. /*******第二种情况********/
  26. p2.then(() => {
  27. console.log('p2-1');
  28. }).then(() => {
  29. console.log('p2-2');
  30. }).then(() => {
  31. console.log('p2-3');
  32. })
  33. p.then(() => {
  34. console.log('p-1');
  35. }).then(() => {
  36. console.log('p-2');
  37. }).then(() => {
  38. console.log('p-3');
  39. })
  40. // 运行结果如下
  41. p-1
  42. p-2
  43. p2-1
  44. p-3
  45. p2-2
  46. p2-3

3. 参数是一个普通的对象(不含then方法) / 原始值 / 单独的then方法

返回一个promise对象,且resolve的参数是被处理的参数

  1. Promise.resolve('hello world').then(result => console.log(result));
  2. Promise.resolve({a: 'hello'}).then(result => console.log(result));
  3. function then(resolve, reject) {
  4. consoel.log('test'); // 不会执行
  5. resolve('fn');
  6. }
  7. Promise.resolve(then).then(result => console.log('fn--',result))
  8.  
  9. // 运行结果如下:
  10. hello world
  11. {a: 'hello'}
  12. fn--function then(resolve,reject){resolve('fn')}

4.参数是一个带有普通then方法的对象

返回一个状态是pending的promise对象。不会触发后面的then方法的回调函数。

  1. const obj = {
  2. then() { console.log('then') }
  3. }
  4. Promise.resolve(obj).then(result => console.log('obj1-->',result));
  5. // 相当于
  6. new Promise((resolve,reject) => {
  7. // obj含有then方法
  8. resolve(obj); // 相当于obj.then()立即执行,后面没有处理状态的函数
  9. })

运行结果:只打印then

5. 参数对象的then方法是一个带有函数参数的方法

因为对象的then方法默认立即执行,系统默认将resolve,reject作为参数传入对象的then方法。

即第一个参数是resolve,第二个参数是reject。

  • 如果对象的then方法,没有调用函数参数,相当于普通then方法,返回一个pending状态的promise对象
  • 如果调用了then方法中的函数参数,返回一个promise对象,函数参数的数据是promise对象返回的数据
  1. const thenable = {
  2. then(a,b) {
  3. console.log('console-thenable');
  4. a('ok');
  5. }
  6. }
  7. Promise.resolve(thenable)
  8. .then(result => console.log('thenable1-->',result))
  9. .catch(err => console.log('err1-->', err))
  10. // 相当于
  11. new Promise((resolve,reject) => {
  12. resolve(thenable); //相当于thenbale.then(resolve,reject)--> resolve('ok')
  13. }).then(result => console.log('thenable2-->', result))
  14. .catch(err => console.log('err-->',err));
  15. // 运行结果如下:
  16. console-thenable //立即执行的结果
  17. console-thenable
  18. thenable1-->ok
  19. thenable2-->ok
  20.  
  21. //如果修改obj的内容如下;
  22. const thenable = {
  23. then(a,b) {
  24. console.log('console-thenable');
  25. b(new Error('err'));
  26. }
  27. }
  28. // 运行结果如下:
  29. console-thenable
  30. console-thenable
  31. err1-->Error: err
  32. err2-->Error: err

应用: 

将函数转为异步操作

  1. function getData() {
  2. return 5;
  3. }
  4. // 要求在返回数据后进行后续操作
  5. Promise.resolve(getData()).then(data => {
  6. console.log(data); //
  7. })

2. Promise.reject()

返回一个promise实例,实例状态为rejected。语法:

  1. Promise.reject(obj);
  2. // 相当于
  3. new Promise(function(resolve,reject) {
  4. reject(obj)
  5. })

即使遇到含有then方法的对象是处理结果和Promise.resolve()不同。

  1. // .catch
  2. const obj = {
  3. thenable: (res,rej) => {
  4. rej('err');
  5. }
  6. }
  7. Promise.reject(obj).catch(err => {
  8. console.log(err); //err不是rej的参数,而是整个obj对象{thenable: f}
  9. });

3. Promise.all()

接受一个数组(每个参数都是promise实例)或者 Iterator接口(每个返回值都是promise实例)作为参数。

如果参数不是promise实例,系统会自动调用Promise.resolve()方法,将参数转为promise实例。

  1. const arr = [1,2];
  2. Promise.all(arr) // 相当于 arr.map(i => Promise.resolve(i))
  3. .then(data => console.log('data-->',data))
  4. /****运行结果如下***/
  5. // data--> [1,2]

返回一个新的Promise实例。

  1. const promises = [1,3,4,5].map(item => Promise.resolve(item));
  2. const newP = Promise.all(promises); //生成新的实例

状态由参数中的每个实例共同决定。

1)如果新的实例状态为fulfilled,  则要求所有的参数实例的状态都是fulfilled。

此时,每个实例的返回值组成一个数组传递给回调函数。

  1. const promises = [1,3,4,5]; // 自动转promise
  2. const newP = Promise.all(promises); //生成新的实例
  3. // promises对应实例对象全部都是fulfilled状态
  4. newP.then(result => console.log('result-->', result));
  5. // 也可以使用参数解构
  6. newP.then(([p1,p2,p3,p4]) => console.log(p1,p2,p3,p4));
  7. //运行结果如下:
  8. result-->[1,3,4,5]
  9. 1 3 4 5

2) 如果新的实例状态为rejected,只要参数实例有一个被rejected,就会触发新实例的回调函数。

且被rejected实例的返回值会作为回调函数的参数。

  1. const promises1 = [1,3,4,5].map(item => Promise.resolve(item));
  2. const promises2 = new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. reject(new Error('错误'))
  5. }, 5000); // 该setTimeout虽然是异步任务,但是promise还未执行完,所以还是promise内部的异常。区分
  6. })
  7. const newP = Promise.all([...promises1, promises2]); //生成新的实例
  8. newP.then(result => console.log('result-->', result))
  9. .catch(err => console.log('err-->', err));
  10.  
  11. // 运行结果如下:
  12. err-->Error: 错误 // 5秒中后打印

3)如果参数中的实例自己有catch方法,那么不会触发新实例的catch方法

  1. // 当参数实例没有catch方法,捕获第一个错误
  2. const p1 = Promise.reject('err1');
  3. const p2 = Promise.reject('err2');
  4. Promise.all([p1,p2])
  5. .then(data => console.log('data-->',data))
  6. .catch(err => console.log('err-->',err)); // err1 catch方法返回的Promise对象是resolved状态
  7. /***运行结果如下***/
  8. err-->err1
  9.  
  10. // 当参数实例自己有catch方法
  11. const p1 = Promise.reject(new Error('err1')).catch(err => err);
  12. const p2 = Promise.reject(new Error('err2')).catch(err => 5);
  13. Promise.all([p1,p2])
  14. .then(data => console.log('data-->',data))
  15. .catch(err => console.log('err-->',err));
  16. /****运行结果如下***/
  17. data--> [Error: err1, 5]

4. Promise.race()

参数性质和Promise.all()一样,都是以参数为Promise实例的数组为参数。如果不是实例,自动转为实例。

返回一个新的Promise实例。

作用不一样:

只要有一个参数实例的状态发生改变,新的实例的状态随之改变,参数实例的返回值作为对应的回调函数的参数。

应用:用来设置超时时间

  1. function fetch(url) {
  2. return new Promise((resolve,reject) => {
  3. setTimeout(() => {
  4. // 伪代码,2秒钟才能拿到结果
  5. resolve('data')
  6. }, 2000)
  7. })
  8. }
  9. const p1 = fetch();
  10. const p2 = new Promise((resolve,reject) => {
  11. setTimeout(() => {
  12. reject(new Error("请求超时"));
  13. }, 500); // 相当于设置超时时间为500ms
  14. });
  15. Promise.race([p1,p2])
  16. .then(data => console.log('data-->',data))
  17. .catch(err => console.log('err-->',err))
  18.  
  19. // 运行结果如下
  20. err--> Error: 请求超时 //500ms后打印

5. Promise.allSelected() ES2020:浏览器支持

参数同上,返回一个新的Promise对象。

该方法等待所有的参数实例对象状态全部改变(返回结果),才会触发回调。

且新的对象的状态只有fulfilled一个状态。

回调函数的参数是一组对象组成的数组:

  1. // 主要有两种
  2. [
  3. {status: 'fulfilled', value: 'data'}, // 成功
  4. {status: 'rejected', reason: Error: 请求超时} // 失败
  5. ....
  6. ]

示例:

  1. function fetch(url) {
  2. return new Promise((resolve,reject) => {
  3. setTimeout(() => {
  4. // 伪代码,2秒钟才能拿到结果
  5. resolve('data')
  6. }, 2000)
  7. })
  8. }
  9. const p1 = fetch();
  10. const p2 = new Promise((resolve,reject) => {
  11. setTimeout(() => {
  12. reject(new Error("请求超时"));
  13. }, 500); // 相当于设置超时时间为500ms
  14. });
  15. Promise.allSettled([p1,p2])
  16. .then(data => console.log('data-->',data))
  17. .catch(err => console.log('err-->',err))
  18.  
  19. // 运行结果如下:
  20. data -->[{status: 'fulfilled', value: 'data'}, {status: 'rejected', reason: Error: 请求超时}] //2秒后打印

应用:

不关心运行结果,只关心是否运行结束时

  1. Promise.allSettled([p1,p2,p3]).then(result => {
  2. //只要触发回调函数,就证明所有的参数实例全部运行完成
  3. })

6. Promise.any() 提案

参数同上。返回一个新的Promise对象。

只要有一个状态变为fulfilled,新的对象状态变为fulfilled,触发回调;

所有的状态变为rejected,新的对象的状态才变为rejected,触发catch回调。

回调函数的参数是一个所有实例返回错误结果的数组。

7. Promise.try()提案

参数是一个函数。用于统一同步函数和异步函数的处理机制。

fn是同步函数,就按照同步函数的规则运行;如果fn是异步函数,就按照异步函数运行。

  1. Promise.try(fn)
  2. .then()
  3. .catch()

Promise是什么?的更多相关文章

  1. Javascript - Promise学习笔记

    最近工作轻松了点,想起了以前总是看到的一个单词promise,于是耐心下来学习了一下.   一:Promise是什么?为什么会有这个东西? 首先说明,Promise是为了解决javascript异步编 ...

  2. 路由的Resolve机制(需要了解promise)

    angular的resovle机制,实际上是应用了promise,在进入特定的路由之前给我们一个做预处理的机会 1.在进入这个路由之前先懒加载对应的 .js $stateProvider .state ...

  3. angular2系列教程(七)Injectable、Promise、Interface、使用服务

    今天我们要讲的ng2的service这个概念,和ng1一样,service通常用于发送http请求,但其实你可以在里面封装任何你想封装的方法,有时候控制器之间的通讯也是依靠service来完成的,让我 ...

  4. 闲话Promise机制

    Promise的诞生与Javascript中异步编程息息相关,js中异步编程主要指的是setTimout/setInterval.DOM事件机制.ajax,通过传入回调函数实现控制反转.异步编程为js ...

  5. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  6. Promise的前世今生和妙用技巧

    浏览器事件模型和回调机制 JavaScript作为单线程运行于浏览器之中,这是每本JavaScript教科书中都会被提到的.同时出于对UI线程操作的安全性考虑,JavaScript和UI线程也处于同一 ...

  7. JavaScript进阶之路——认识和使用Promise,重构你的Js代码

    一转眼,这2015年上半年就过去了,差不多一个月没有写博客了,"罪过罪过"啊~~.进入了七月份,也就意味着我们上半年苦逼的单身生活结束了,从此刻起,我们要打起十二分的精神,开始下半 ...

  8. 细说Promise

    一.前言 JavaScript是单线程的,固,一次只能执行一个任务,当有一个任务耗时很长时,后面的任务就必须等待.那么,有什么办法,可以解决这类问题呢?(抛开WebWorker不谈),那就是让代码异步 ...

  9. 浅谈Angular的 $q, defer, promise

    浅谈Angular的 $q, defer, promise 时间 2016-01-13 00:28:00  博客园-原创精华区 原文  http://www.cnblogs.com/big-snow/ ...

  10. angular学习笔记(二十八-附2)-$http,$resource中的promise对象

    下面这种promise的用法,我从第一篇$http笔记到$resource笔记中,一直都有用到: HttpREST.factory('cardResource',function($resource) ...

随机推荐

  1. 在Python虚拟环境中安装scrapy

    虚拟环境安装scrapy 在虚拟环境中执行命令 (scrapyenv) E:\Python\Envs>pip install -i https://pypi.douban.com/simple/ ...

  2. 使用BBED跳过归档进行恢复

    https: 使用BBED跳过归档进行恢复 数据库启动异常,提示6号文件丢失 SQL> startup ORACLE instance started. Total System Global ...

  3. Node.js读取某个目录下的所有文件夹名字并将其写入到json文件

    针对解决的问题是,有些时候我们需要读取某个文件并将其写入到对应的json文件(xml文件也行,不过目前用json很多,json是主流). 源码如下:index.js var fs = require( ...

  4. 20175310 《Java程序设计》第7周学习总结

    20175310 <Java程序设计>第7周学习总结 本周博客: https://www.cnblogs.com/xicyannn/p/10705376.html 教材学习内容总结 这周学 ...

  5. AutoMapper快速上手

    一.什么是AutoMapper  AutoMapper是一个简单的对象映射框架(OOM),对象映射原理是把一种类型的输入对象转换为不同类型的输出对象,通俗讲就是通过一些约束讲一种类型中数据自动映射到另 ...

  6. 【原创】分布式之elk日志架构的演进

    引言 好久没写分布式系列的文章了,最近刚好有个朋友给我留言,想看这方面的知识.其实这方面的知识,网上各种技术峰会的资料一抓一大把.博主也是凑合着写写.感觉自己也写不出什么新意,大家也凑合看看. 日志系 ...

  7. NLP之——Word2Vec详解

    2013年,Google开源了一款用于词向量计算的工具--word2vec,引起了工业界和学术界的关注.首先,word2vec可以在百万数量级的词典和上亿的数据集上进行高效地训练:其次,该工具得到的训 ...

  8. IT江湖--这个冬天注定横尸遍野

    今年江湖大事繁起,又至寒冬,冻的不仅是温度,更是人心. 这两天上班途中看到多个公众号和媒体发了很多 "XXX公司裁员50%" 等等诸如此类的文章,也真是撼动人心.寒冬,比以往来的更 ...

  9. P2P平台介绍

    https://www.ludou.org/tutengdai.html https://www.tutengdai.com/register?invite_code=9991300

  10. Create a toolwindow for the VBA editor with .NET(C#).

    原始出处:http://www.cnblogs.com/Charltsing/p/VBEtoolwindow.html 最近有人问起使用C#在VBE插件中创建toolwindow的事情,由于VBE窗口 ...