一、背景


1、Node.js 异步控制

在之前写的 callback vs async.js vs promise vs async / await 里,我介绍了 ES6 的 promise 和 ES7 的 async / await 的基本用法。

可以肯定的是,node.js 的异步控制(asynchronous JavaScript),promise 就是未来的主流,诸如 async.js 等非 promise 库( async.js 基于 callback )终将被淘汰,而基于 promise 的第三方库(Q、when、WinJS、RSVP.js)也会被 async / await 写法取代。

延伸阅读:知乎 - nodejs异步控制「co、async、Q 、『es6原生promise』、then.js、bluebird」有何优缺点?最爱哪个?哪个简单?

2、已经有 ES6 Promise + async / await 了,为什么还要用 bluebird ?

但目前基于 async / await 的 promise 写法还不是很强大。这里可以考虑用 bluebird,它是一个第三方的 Promise 库,比 async / await 更早诞生,但是完全兼容,因为他们都是基于 Promises/A+ 的标准(下文会介绍)。

很多第三方的 promise 库都是兼容 ES6 promise 的,比如 Q 。

二、Promise 进阶


1、Promise 前世今生

(1)定义

They describe an object that acts as a proxy for a result that is initially unknown, usually because the computation of its value is not yet complete.

有道翻译:他们描述了一个对象,该对象充当最初未知的结果的代理,通常是因为其值的计算尚未完成。

“代理”这个词用的挺好的。

(2)历史

promise 一词由丹尼尔·福瑞得曼和 David Wise 在1976年提出。

后来演化出别称:futuredelaydeferred,通常可以互换使用。

promise 起源于函数式编程和相关范例(如逻辑编程 ),目的是将值(future)与其计算方式(promise)分离,从而允许更灵活地进行计算。

应用场景:

  • 并行化计算

  • 分布式计算

  • 编写异步程序,避免回调地狱

(3)各语言支持

现在主流的语言对 future/promise 都有支持。

  • Java 5 中的 FutureTask(2004年公布)

  • .NET 4.5 中的 async / await

  • Dart(2014)

  • Python(2015)

  • Hack(HHVM)

  • ECMAScript 7(JavaScript)

  • Scala

  • C++ 草案

  • ……

2、Promises/A+

官方:https://promisesaplus.com/

介绍:An open standard for sound, interoperable JavaScript promises—by implementers, for implementers.

可以理解成 javascript 中 关于 promise 的实现标准。

3、 拓展 - jQuery 中的 Promise

(1)介绍

从 jQuery 1.5.0 版本开始引入的一个新功能 —— deferred 对象。

注意:Deferred 虽然也是一种 promise 的实现,但是跟 Promise/A+ 并不兼容

但可以将其转为标准的 promise,例如:

var jsPromise = Promise.resolve($.ajax('/whatever.json'))
(2)用法

因为 jQuery 现如今很少用到了,仅简单介绍下 deferred 的用法吧。

1、以 ajax 操作为例:

$.ajax() 操作完成后,如果使用的是低于1.5.0版本的 jQuery,返回的是 XHR 对象,你没法进行链式操作;如果高于 1.5.0 版本,返回的是 deferred 对象,可以进行链式操作。

# old
$.ajax({url: "test.html",success: function(){alert("哈哈,成功了!");},error:function(){alert("出错啦!");}});# new 
$.ajax("test.html").done(function(){ alert("哈哈,成功了!"); }).fail(function(){ alert("出错啦!"); });

2、其它

  • $.when() 类似 promise.all()

  • deferred.resolve()deferred.reject() 类似 Promise.resolve()、Promise.reject()

  • ……

三、bluebird


1、介绍

英文文档:

http://bluebirdjs.com/docs/api-reference.html

中文文档:

https://itbilu.com/nodejs/npm/VJHw6ScNb.html

2、安装

npm install bluebird

3、使用

const Promise = require('bluebird')

这样写会覆盖原生的 Promise 对象。

4、早期原生性能问题

早期 js 标准库里并没有包含 Promise,所以被迫只能用第三方的 Promise 库,例如 bluebird。

后来 ES6 和 ES7 相继推出了原生的 Promise 和 async/await ,但性能很差,大家还习惯用例如bluebird。

但到了 Node.js v8.x ,原生性能已经得到了很大的优化,可以不需要使用 bluebird 这样的第三方 Promise 库。(除非需要用到 bluebird 的更多 feature,而原生是不具备的。这个下面会详细介绍)

详情可以参考这篇文章:Node 8:迎接 async await 新时代

四、bluebird 用法


这一章,会结合 bluebird 用法 和 原生(主要以 ES7 的 async / wait) 探讨出最优写法。

1、回调形式 -> Promise 形式

大部分 NodeJS 的标准库 API 和不少第三方库的 API 都使用了回调方法的模式,也就是在执行异步操作时,需要传入一个回调方法来接受操作的执行结果和可能出现的错误。

例如 NodeJS 的标准库中的 fs 模块:

const fs = require('fs'),path = require('path');fs.readFile(path.join(__dirname, 'sample.txt'), 'utf-8', (err, data) => {if (err) {console.error(err);} else {console.log(data);}
});
(1)bluebird

对于这样的方法,bluebird 的 promisifyAll()promisify() 可以很容易的将它们转换成使用 Promise 的形式。

// 覆盖了原生的Promise
const Promise = require('bluebird'),fs = require('fs'),path = require('path');// 1、promisifyAll
// Promise.promisifyAll 方法可以为一个对象的属性中的所有方法创建一个对应的使用 Promise 的版本
Promise.promisifyAll(fs);
// 这些新创建方法的名称在已有方法的名称后加上"Async"后缀
// (除了 readFile 对应的 readFileAsync,fs 中的其他方法也都有了对应的 Async 版本,如 writeFileAsync 和 fstatAsync 等)
fs.readFileAsync(path.join(__dirname, 'sample.txt'), 'utf-8').then(data => console.log(data)).catch(err => console.error(err));// 2、promisify
// Promise.promisify 方法可以为单独的方法创建一个对应的使用 Promise 的版本
let readFileAsync = Promise.promisify(fs.readFile)
readFileAsync(path.join(__dirname, 'sample.txt'), 'utf-8').then(data => console.log(data)).catch(err => console.error(err));
(2)原生

在 node.js 8.x版本中,可以用 util.promisify() 实现 promisify() 一样的功能。

在官方推出这个工具之前,民间已经有很多类似的工具了,除了bluebird.promisify,还有比如es6-promisify、thenify。

2、使用 promise —— .finally()

.finally() 可以避免同样的语句需要在 then() 和 catch() 中各写一次的情况。

(1)bluebird
Promise.reject(new TypeError('some error')).catch(TypeError, console.error).finally(() => console.log('done'));
(2)自己实现
Promise.prototype.finally = function (callback) {return this.then(function (value) {return Promise.resolve(callback()).then(function () {return value;});}, function (err) {return Promise.resolve(callback()).then(function () {throw err;});});
}; 
(3)async / await

用 try...catch...finally 的 finally 即可实现。

(4)原生

.finally() 是ES2018(ES9)的新特性。

3、使用 promise —— .cancel()

(1)bluebird

当一个 Promise 对象被 .cancel() 之后,只是其回调方法都不会被调用,并不会取消正在进行的异步操作

// 先修改全局配置,让 promise 可被撤销
Promise.config({cancellation: true, // 默认为 false
});// 构造一个 promise 对象,并设置 1000 ms 延迟
let promise = Promise.resolve("hello").then((value) => {console.log("promise 的 async function 还是执行了……")return value
}).delay(1000)// promise 对象上绑定回调函数
promise.then(value => console.log(value))// 取消这个 promise 对象的回调
setTimeout(() => {promise.cancel();
}, 500);输出:
promise 的 async function 还是执行了……

这里提到的 .delay() 方法下面会介绍。

(2)async / await

可以通过对 async / await 函数调用后的返回值,做 if 判断,决定要不要执行接下来的逻辑。

4、处理 promise 集合

之前的代码示例都针对单个 Promise。在实际中,经常会处理与多个 Promise 的关系。

(1)bluebird

以 fs 模块分别读取 sample1.txtsample2.txtsample3.txt 三个文件的内容为例。他们的文件内容分别为 “1”、“2”、“3”。


const Promise = require('bluebird'),fs = require('fs'),path = require('path');
Promise.promisifyAll(fs);// 一、并行操作// 1、Promise.all ,必须全部成功才通过 【保证返回顺序】
Promise.all([fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8')
]).then(results => console.log(results.join(', '))).catch(console.error);// 1.1、Promise.props ,约等于 Promise.all,但不同的在于: 返回的不是数组而是对象 !
Promise.props({app1: fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),app2: fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),app3: fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8'),
}).then(results => console.log(results)).catch(console.error);// 1.2 Promise.join,约等于 Promise.all 【保证返回顺序】, 但不同的在于: 成功结果不是 array 而是多个参数 !
Promise.join(fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8'),(a, b, c) => console.log(a, b, c));// 1.3、Promise.filter ,约等于 Promise.all 之后对成功结果的 Array 进行 filter 过滤 【保证返回顺序】 
Promise.filter([fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8')
], value => value > 1).then(results => console.log(results.join(', '))).catch(console.error);// ----------// 2、Promise.map ,约等于 Promise.all 【保证返回顺序】
Promise.map(['sample1.txt', 'sample2.txt', 'sample3.txt'],name => fs.readFileAsync(path.join(__dirname, name), 'utf-8')
).then(results => console.log(results.join(', '))).catch(console.error);// 2.1 Promise.reduce,约等于 Promise.map 
Promise.reduce(['sample1.txt', 'sample2.txt', 'sample3.txt'],(total, name) => {return fs.readFileAsync(path.join(__dirname, name), 'utf-8').then(data => total + parseInt(data));}
, 0).then(result => console.log(`Total size: ${result}`)).catch(console.error);// ----------// 3、Promise.some 只要成功 N 个就通过 【不保证返回顺序】
Promise.some([fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8')], 3).then(results => console.log(results.join(', '))).catch(console.error);// 3.1、Promise.any 只要成功 1 个就通过,约等于 Promise.some (N = 1),但不同的在于:返回的不是数组而是单个值了!
Promise.any([fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8')
]).then(results => console.log(results)).catch(console.error);// 3.2、Promise.race 只要成功 1 个就通过,约等于 Promise.any (N = 1),但不同的在于:如果成功返回前遇到了失败,则会不通过!
Promise.race([fs.readFileAsync(path.join(__dirname, 'sample1.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample2.txt'), 'utf-8'),fs.readFileAsync(path.join(__dirname, 'sample3.txt'), 'utf-8')
]).then(results => console.log(results)).catch(console.error);// ----------// 二、串行// 4、Promise.mapSeries ,约等于 Promise.map 【保证返回顺序】,但不同的在于: 这是串行不是并行!
Promise.mapSeries(['sample1.txt', 'sample2.txt', 'sample3.txt'],name => fs.readFileAsync(path.join(__dirname, name), 'utf-8').then(function(fileContents) {  return name + "!";})
).then(results => console.log(results.join(', '))).catch(console.error);
// 'sample1.txt!, sample2.txt!, sample3.txt!'// 4.1、Promise.each ,约等于 Promise.mapSeries 【保证返回顺序】, 但不同的在于: 只是单纯的遍历,每次循环的 return 毫无影响 !
Promise.each(['sample1.txt', 'sample2.txt', 'sample3.txt'],name => fs.readFileAsync(path.join(__dirname, name), 'utf-8').then(function(fileContents) { return name + "!";  // 无效})
).then(results => console.log(results.join(', '))).catch(console.error);
// 'sample1.txt, sample2.txt, sample3.txt'

1、大多数函数都是并行的。其中 map、filter 还有 Concurrency coordination (并发协调)功能。

注意:

1、因为 Node.js 是单线程,这里的并发只是针对 promise 而言,实际上底层还是串行

2、并发数的多少,取决于你 promise 执行的具体功能,如网络请求、数据库连接等。需根据实际情况来设置。

以 map 为例:

// 控制并发数
Promise.map(['sample1.txt', 'sample2.txt', 'sample3.txt'],name => fs.readFileAsync(path.join(__dirname, name), 'utf-8'),{concurrency: 2}
).then(results => console.log(results.join(', '))).catch(console.error);

2、mapSeries、each 是串行,也可以看成是 {concurrency: 1} 的特例。

(2)拓展 - promiseAll 实现原理
function promiseAll(promises) {return new Promise(function(resolve, reject) {if (!isArray(promises)) {return reject(new TypeError('arguments must be an array'));}var resolvedCounter = 0;var promiseNum = promises.length;var resolvedValues = new Array(promiseNum);for (var i = 0; i < promiseNum; i++) {(function(i) {Promise.resolve(promises[i]).then(function(value) {resolvedCounter++resolvedValues[i] = valueif (resolvedCounter == promiseNum) {return resolve(resolvedValues)}}, function(reason) {return reject(reason)})})(i)}})
}

注意:Promise.resolve(promises[i])这段的意思,是防止 promises[i] 为非 promise 对象,而强制转成 promise 对象。

此源码地址为: promise-all-simple

(3)async / await

对于上面的并行操作,建议用 bluebird (原生貌似现在只支持 Promise.all() ,太少了)。

对于上面的串行操作,可以用 循环 搭配 async / await 即可。

5、资源使用与释放

如果在 Promise 中使用了需要释放的资源,如数据库连接,我们需要确保这些资源被应有的释放。

(1)bluebird

方法1:finally() 中添加资源释放的代码(上文有介绍)

方法2【推荐】:使用资源释放器(disposer)和 Promise.using()。

(2)async / await

利用 async / await 中的 try...catch...finally 中的 finally

6、定时器

(1)bluebird
async function test() {try {let readFilePromise = new Promise((resolve, reject) => {resolve('result')})let result = await readFilePromise.delay(1000).timeout(2000, 'timed out') console.log(result);} catch (err) {console.log("error", err);  }
}test();

1、默认的, new Promise 会立即执行,但是加了 delay(),可以延迟执行。

2、timeout() 可以设置执行的 timeout 时间,超过即抛出 TimeoutError 错误。

(2)async / await

暂时没有方便的替代写法。

7、实用方法

(1)bluebird

bluebird 的 Promise 中还包含了一些实用方法。taptapCatch 分别用来查看 Promise 中的结果和出现的错误。这两个方法中的处理方法不会影响 Promise 的结果,适合用来执行日志记录。call 用来调用 Promise 结果对象中的方法。get 用来获取 Promise 结果对象中的属性值。return 用来改变 Promise 的结果。throw 用来抛出错误。catchReturn 用来在捕获错误之后,改变 Promise 的值。catchThrow 用来在捕获错误之后,抛出新的错误。

(2)async / await

上面 bluebird 的实用方法,在 async / await 的写法里,显得无足轻重了。

8、错误处理

(1)拓展 - then() 的多次指定与报错

对一个 resolve 的 promise ,指定多个 then:

let promiseObj = new Promise((resolve, reject) => {resolve()})// 第一次指定 then
promiseObj.then(function (data) {console.log("success1");
}, function (data) {console.log("fail1");
})
// 第二次指定 then
promiseObj.then(function (data) {console.log("success2");
}, function (data) {console.log("fail2");
})// 第三次指定 then
promiseObj.then(function (data) {console.log("success3");
})// 第四次指定 then(catch)
promiseObj.catch(function (data) {console.log("fail4");
})输出:
success1
success2
success3

对一个 reject 的 promise ,指定多个 then:

let promiseObj = new Promise((resolve, reject) => {reject()})// 第一次指定 then
promiseObj.then(function (data) {console.log("success1");
}, function (data) {console.log("fail1");
})
// 第二次指定 then
promiseObj.then(function (data) {console.log("success2");
}, function (data) {console.log("fail2");
})// 第三次指定 then
promiseObj.then(function (data) {console.log("success3");
})// 第四次指定 then(catch)
promiseObj.catch(function (data) {console.log("fail4");
})输出:
fail1
fail2
fail4
Unhandled rejection undefined

结论:

1、对于一个 promise 对象,我们可以多次指定它的 then()。

2、当此 promise 状态变为 resolve,即使没有 then() 或者 有 then() 但是没有 successCallback,也不会有问题。

3、当此 promise 状态变为 reject, 如果没有 then() 或者有 then() 但是没有 failureCallback ,则会报错(下面会介绍如何捕获这个错)。

(2)bluebird

1、本地错误处理

利用 then() 的 failureCallback(或 .catch() )。不赘述了。

2、全局错误处理

bluebird 提供了 promise 被拒绝相关的两个全局事件,分别是 unhandledRejectionrejectionHandled

let promiseObj = new Promise((resolve, reject) => {reject('colin')})setTimeout(() => {promiseObj.catch(function (data) {console.log("fail");})
}, 2000);process.on('unhandledRejection', (reason, promise) => console.error(`unhandledRejection ${reason}`));process.on('rejectionHandled', (reason, promise) => console.error(`rejectionHandled ${reason}`));输出:
unhandledRejection colin
rejectionHandled [object Promise]
fail

1、promise 的 reject 没有被处理(即上面所述),则会触发 unhandledRejection 事件

2、但可能 针对 reject 的处理延迟到了下一个事件循环才被执行,那就会触发 rejectionHandled 事件

所以我们得多等等 rejectionHandled 事件,防止误判,所以可以写成下面全局错误处理的代码:

let possiblyUnhandledRejections = new Map();
// 当一个拒绝未被处理,将其添加到 map
process.on("unhandledRejection", function(reason, promise) {possiblyUnhandledRejections.set(promise, reason);
});
process.on("rejectionHandled", function(promise) {possiblyUnhandledRejections.delete(promise);
});
setInterval(function() {possiblyUnhandledRejections.forEach(function(reason, promise) {// 做点事来处理这些拒绝handleRejection(promise, reason);});possiblyUnhandledRejections.clear();
}, 60000);
(3)async / await 的错误处理

async / await 的 try..catch 并不能完全捕获到所有的错误。

1、本地错误处理

用 try...catch 即可。

注意:漏掉错误 情况:

run() 这个 promise 本身 reject 了

async function run() {try {// 注意这里没有 awaitreturn Promise.reject();} catch (error) {console.log("error",error)// 代码不会执行到这里}
}
run().catch((error) => {// 可以捕获console.log("error2", error)
});

解决方法:针对 run() 函数 (顶层函数)做好 catch 捕获。

2、全局错误处理

漏掉错误 情况:

run() 这个 promise 内部存在 reject 但没有被处理的 promise

async function run() {try {// 注意这里 即没有 await 也没有 returnPromise.reject();} catch (error) {console.log("error", error)// 代码不会执行到这里}
}
run().catch((error) => {// 不可以捕获console.log("error2", error)
});

解决方法:

1、跟上面介绍的 bluebird 全局错误处理一样,用好unhandledRejectionrejectionHandled 全局事件。

2、ES6 原生也支持 unhandledRejectionrejectionHandled 全局事件。


参考资料

使用 bluebird 实现更强大的 Promise

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 02Node.js——CommonJs标准

    是一套规范管理模块每个js 为一个模块,多个模块作为一个包node.js和Couchdb是对其的实现;不同于jQuery模块:定义、标识、引用(地址/模块名称)模块类型:核心模块http fs path文件模块var util=require(‘./util.js’)第三方模块npm var promise=require(‘bluebird’)模块…...

    2024/4/15 3:55:32
  2. node.js模块的坑

    在写一个工具的时候,需要将xml转为json方便处理,以前电脑上装的node.js的版本为0.8,结果我再安装node-xml2json时提示版本过低,然后我又重装安装了最新版本。 然后再次尝试安装,首先报python版本不对,不支持3.0,然后再降级,再然后说windows系统需要先安装node-expat,…...

    2024/4/15 3:55:31
  3. Node.js NPM Tutorial Create, Publish, Extend & Manage

    A module in Node.js is a logical encapsulation of code in a single unit. It’s always a good programming practice to always segregate code in such a way that makes it more manageable and maintainable for future purposes. That’s where modules in Node.js co…...

    2024/4/15 3:55:30
  4. node.js+mongodb

    安装: Node.js : 0.10.32Express : 4.10.2MongoDB : 2.6.1sublime3过程中要用到的东西amaze ui前端框架,放在public文件夹下与其他并列vue和jquery:vue.js ,jquery-2.1.4.min.js,JSXTranformer.js放在javascripts里安装的包有:"async": "^1.5.0"…...

    2024/4/17 11:46:50
  5. 如何使用Node.js解析JSON?

    我应该如何使用Node.js解析JSON? 是否有一些模块可以安全地验证和解析JSON? #1楼我想提一下,全局JSON对象还有其他选择。 JSON.parse和JSON.stringify都是同步的,因此,如果要处理大对象,则可能需要检出一些异步JSON模块。 看看: https : //github.com/joyent/node/wik…...

    2024/4/18 7:23:06
  6. Fundebug后端Node.js插件更新至0.2.0,支持监控Express慢请求

    摘要: 性能问题也是BUG,也需要监控。Fundebug后端Node.js异常监控服务 Fundebug是专业的应用异常监控平台,我们Node.js插件fundebug-nodejs可以提供全方位的异常监控,支持Express、Koa以及Hapi框架。 从用户的角度理解,性能问题某种程度上也是BUG,它可能是数据库的索引问…...

    2024/4/15 3:55:27
  7. node打包工具--Pgk

    使用pkg打包Node.js应用的方法步骤 Node.js应用不需要经过编译过程,可以直接把源代码拷贝到部署机上执行,确实比C++、Java这类编译型应用部署方便。然而,Node.js应用执行需要有运行环境,意味着你需要先在部署机器上安装Node.js。虽说没有麻烦到哪里去,但毕竟多了一个步骤,…...

    2024/4/15 3:55:26
  8. 一次一个微优化,改进Node.js应用的吞吐量

    \本文要点\借助分组或批量写,尽量最小化系统调用数量。 \考虑应用中各种定时器的发布和清除开销。 \CPU性能分析器能提供有用的信息,但是不会告诉问题的原委。 \慎用ECMAScript高级特性,尤其是在未使用最新版JavaScript引擎或源码到源码的编译器时。 \控制QDF依赖树,并对依…...

    2024/4/18 17:39:38
  9. 初学node.js(二)npm、模块更新、异步回调

    继续学习node.js~ 表示在公司每天都能学到新的知识点,很happy了~Node.js - npmnpm 表示节点程序包管理器。npm 提供以下两个主要功能:Node.js包/模块的在线软件仓库 命令行实用程序安装包,作为Node.js版本管理和依赖包管理。Node.js v0.6.3版本后才开始捆绑 npm 安装。为了…...

    2024/4/15 3:55:24
  10. node.js连接mongodb

    学会简单的nodejs之后我们就可以开始试着学习连接数据库了,这里我向大家推荐mongodb(mongodb的下载与安装网上资料都有,我就不重复做工了,如果有什么问题的话也可以私信我)。 mongpdb的学习在这里推荐这个网站http://www.runoob.com/mongodb/mongodb-tutorial.html简单易懂…...

    2024/4/19 21:56:57
  11. Node.js简单爬虫开发过程

    背景:c#课上老师问我怎么没有课本,面对30多块的课本表示并不想买,于是各种搜索结果只在书问网看见有电子版,并且只能免费预览几十页。过程:1.本着能不花钱就不花钱的原则,提示我付费继续阅读后清除浏览器数据发现又可以继续看几十页,得出结果:禁用cookie即可无限预览。…...

    2024/4/19 5:42:10
  12. Node.js中package.json中库的版本号详解(^和~区别)

    Node.js中package.json中库的版本号详解(^和~区别)当我们查看package.json中已安装的库的时候,会发现他们的版本号之前都会加一个符号,有的是插入符号(^),有的是波浪符号(~)。那么他们到底有什么区别呢?先贴一个例子,对照例子来做解释:"dependencies": {&q…...

    2024/4/24 13:31:06
  13. Node.js项目的package.json配置文件中的devdependencies 和 dependencies的区别

    1、dependencies和devDependencies 具体代码如下"name": "webpack-react-express","version": "0.2.0","private": true,"dependencies": {"antd": "^2.13.11","babel-polyfill": …...

    2024/4/24 13:31:05
  14. 在 Node.js 应用中集成 Redis

    Node.js 在搭建快速轻量型的 HTTP 服务或 Web 应用有其独特的优势:快速而又友好的开发,单线程消息驱动带来的高并发高吞吐。随着 HTTP 服务或者 Web 应用访问量的加大,传统数据库的读写能力将逐渐成为系统的瓶颈点。为了突破关系型数据库最大读写上限,引入高速内存缓存将是…...

    2024/4/24 13:31:07
  15. 使用bluebird解决promise兼容性问题

    //引入promiseif(!Promise){ var Promise = require("bluebird"); // Configure Promise.config({ longStackTraces: true, warnings: true // note, run node with --trace-warnings to see full stack traces for warnings }) } 转载于:https…...

    2024/4/24 13:31:03
  16. 你不知道的Node.js性能优化,读了之后水平直线上升

    本文由云+社区发表“当我第一次知道要这篇文章的时候,其实我是拒绝的,因为我觉得,你不能叫我写马上就写,我要有干货才行,写一些老生常谈的然后加上好多特技,那个 Node.js 性能啊好像 Duang~ 的一下就上去了,那读者一定会骂我,Node.js 根本没有这样搞性能优化的,都是假…...

    2024/4/24 13:31:03
  17. Node.js方法错误自动重试的实现

    在使用Node.js实现爬虫、检测等功能时,经常会遇到大量网络请求的情况,这时很容易因为超时而使得请求失败。为令结果正确,我们一般会设置一定的失败重试次数,以避免因网络波动引起的失败。若多次尝试最终失败,才抛出错误。下面上一段代码:/*** 包裹方法,使其自动错误重试…...

    2024/4/24 13:31:01
  18. node.js中对 redis 的安装和基本操作

    一、win下安装redishttps://github.com/MicrosoftArchive/redis/releases下载Redis-x64-3.2.100.zip,然后解压,放到自定义目录。 然后打开命令行工具,进入到该目录下,运行安装redis服务。redis-server.exe --service-install redis.windows-service.conf --loglevel verbos…...

    2024/4/24 13:31:01
  19. Node.js ORM 框架 sequelize 实践

    最近在做团队的一个内部系统,这次使用的nodejs web框架是团队统一的hapi.js,而数据库依然是mysql,ORM 框架选用有着6000+ stars 的 sequelize.js,hapi-sequelize插件对sequelize做了很简单的封装,可以让我们很自如地在hapi中游走,比如配置和调用。初始化 sequelize// ser…...

    2024/4/24 13:30:59
  20. Node.js仅仅是个过渡方案?

    文章翻译自:http://www.philipotoole.com/is-node-js-just-a-stopgap/?utm_source=nodeweekly&utm_medium=emailNode.js总有些不太对劲的地方。我编写Node.js程序至今已经有一年时间,总体感觉编写Node.js程序是很有趣的,但我认为Node.js只是个过渡性方案,在需求出现而…...

    2024/4/24 13:30:58

最新文章

  1. 321_C++_字符串流的高级使用法,提高文件读取性能,以高效的方式处理二进制文件、非文本文件(如图像、音频、视频等)或跨平台兼容的文件非常重要

    std::string file;std::filebuf* pbuf = NULL;std::ifstream filestr;size_t tempSize;char* buffer = NULL;filestr.open(strPath, std...

    2024/4/27 9:20:36
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. STM32-GPIO

    &#x1f913;&#x1f913;&#x1f913; 122.1 2.22.3 344.14.24.34.44.54.64.74.8 56788.18.299.19.2 STM32 第一个外设 1 对我们来说 和IO口没区别 ST公司非叫GPIO 2 2.1 第二个是超频了 F1 72M 这翻转就36 2.2 有cmos 和ttl两种数据手册里给出整个芯片最低电流为150ma 单…...

    2024/4/22 10:11:05
  4. 54.螺旋矩阵

    题目描述 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。示例 1&#xff1a;输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5] 示例 2&#xff1a;输入&#xff1a;matrix …...

    2024/4/25 11:11:19
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/26 18:09:39
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/26 20:12:18
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/27 4:00:35
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/25 18:39:22
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/25 18:39:22
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/26 21:56:58
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/27 9:01:45
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/26 16:00:35
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/25 18:39:16
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/26 22:01:59
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/25 2:10:52
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/25 18:39:00
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/25 18:38:58
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57