本作品采用知识共享署名 4.0 国际许可协议进行许可。转载联系作者并保留声明头部与原文链接https://luzeshu.com/blog/bluebirdsource
本博客同步在http://www.cnblogs.com/papertree/p/7163870.html


时隔一年,把之前结尾还有一部分未完成的博客完成。版本2.9。具体忘了哪个revision number。不过原理差不多。

1. 带上几个问题看源码

1. promise链是如何实现的?
2. promise对象如何变成fulfill状态,并触发promise链条的后续函数?new Promise和Promise.resolve() 有何不同?
*3. 为什么每执行.then就创建一个新的Promise对象,而不能使用第一个promise依次.then?
4. 如何对throw Error 和 reject进行加工

第3个问题不是在使用Promise的过程中提出的问题,而是看源码过程中针对源码实现提出的问题。

分两条主线来讲解:
第3节:回调函数的设置、promise链条的保存
第4节:promise对象的解决(设置为rejected、fulfilled)、链条的迁移



2. promise对象的状态

我们知道promise对象有Pendding、Fulfilled、Rejected三种状态。Fulfilled和Rejected都属于Settled。
在Promise对象内部,是通过this._bitField属性的不同位来保存状态信息的。
在Promise内部实现中,远不止使用它时仅有的三种状态,_bitField保存了很多其他的状态信息。比如Following、Followed、Migrated等等。

看一下内部置位、以及判断是否置位等的函数。实际上都是位操作。

Promise.prototype._length = function () {return this._bitField & 131071;
};Promise.prototype._isFollowingOrFulfilledOrRejected = function () {return (this._bitField & 939524096) > 0;
};Promise.prototype._isFollowing = function () {return (this._bitField & 536870912) === 536870912;
};Promise.prototype._setLength = function (len) {this._bitField = (this._bitField & -131072) |(len & 131071);
};Promise.prototype._setFulfilled = function () {this._bitField = this._bitField | 268435456;
};Promise.prototype._setRejected = function () {this._bitField = this._bitField | 134217728;
};Promise.prototype._setFollowing = function () {this._bitField = this._bitField | 536870912;
};Promise.prototype._setIsFinal = function () {this._bitField = this._bitField | 33554432;
};Promise.prototype._isFinal = function () {return (this._bitField & 33554432) > 0;
};Promise.prototype._cancellable = function () {return (this._bitField & 67108864) > 0;
};Promise.prototype._setCancellable = function () {this._bitField = this._bitField | 67108864;
};Promise.prototype._unsetCancellable = function () {this._bitField = this._bitField & (~67108864);
};Promise.prototype._setIsMigrated = function () {this._bitField = this._bitField | 4194304;
};Promise.prototype._unsetIsMigrated = function () {this._bitField = this._bitField & (~4194304);
};Promise.prototype._isMigrated = function () {return (this._bitField & 4194304) > 0;
};



3. promise链如何实现 —— 注册阶段(.then)

我们都知道设置一个promise链是通过promise对象的.then方法注册fulfill、reject 状态被激活时的回调函数。来看一下.then的代码:

3-1.png

图3-1

3.1 promise保存链条的结构

上图可以看到.then内部调用了._then,然后把我们传给.then()函数的didFulfill、didReject等回调函数通过_addCallbacks保存下来。这里注意到,不是通过 “ this._addCallbacks() ”,而是通过 “ target._addCallbacks() ”,而且上一行还判断了 “ target !== this ”的条件。那么target是什么呢?待会3.5节讲。

看到 _addCallbacks的实现,promise对象以每5个参数为一组保存。当对一个promise对象调用一次.then(didFulfill, didReject)的时候,这组相关的参数保存在:

this._fulfillmentHandler0;  // promise对象被置为fulfilled 时的回调函数
this._rejectionHandler0;  // promise对象被置为rejected 时的回调函数。在3.3.1.1中知道,这个可以用来保存followee
this._progressHandler0;
this._promise0;
this._receiver0;  // 当 fulfill被调用时  ,传给函数的 this对象
代码3-1

当在一个promise对象上超过一次调用.then(didFulfill, didReject) 时,大于1的部分以这种形式保存在promise对象上:

var base; // base表示每组参数的起点,每5个参数为一组保存
this[base + 0];
this[base + 1];
this[base + 2];
this[base + 3];
this[base + 4];
代码3-2


3.2 链条的拓扑结构 —— 为何每个.then 都new一个新的Promise对象?

很多说明文档会给出这样的示例代码:

// 来自 http://liubin.org/promises-book/#ch2-promise.then
// promise可以写成方法链的形式aPromise.then(function taskA(value){
// task A
}).then(function taskB(vaue){
// task B
}).catch(function onRejected(error){console.log(error);
});
代码3-3

这样的实现的任务块是这样一种拓扑结构:

3-2.png

图3-2

而对于另一种拓扑结构的任务,有all 和 race方法:

3-3.png

图3-3

如果没有深究,咋一看可能以为上面的“代码3-3”中,依次.then都是在同一个aPromise对象上,而.then所注册的多个回调函数都保存在aPromise上。

事实上,看到上面图3-1中,Promise.prototype._then的代码里面,每次执行_then都会新建一个Promise对象,比如代码3-3实际上等效于这样:

var bPromise = aPromise.then(function taskA(value){
// task A
});
var cPromise = bPromise.then(function taskB(vaue){
// task B
}).catch(function onRejected(error){console.log(error);
});
代码3-4

aPromise、bPromise、cPromise分别是不同的对象。

那么为什么这么实现呢?想一下就会知道这样多种拓扑结构:

3-4.png

图3-4

当在同一个promise对象上多次执行.then时,跟代码3-3依次.then的情况并不一样,如下的示例代码:

var bPromise = aPromise.then(function taskA(value){// task Areturn new Promise(function (resolve) {setTimeout(function () {return resolve();}, 5000);});
});
var cPromise = aPromise.then(function taskB(vaue){// task Bconsole.log('task B');
}); 
代码3-5

这里用aPromise.then两次,注册两个onFulfill函数(function taskA 和 function taskB)。当task A 里返回新建的promise对象处于pending状态时,task B的任务会先执行。

那么这样的promise链条是相当灵活的,可以实现任何网状的依赖关系。那么通过这个发现,我想到利用它来做一件有趣的事情,可以求有向图最短路径的值,看3.3节。


3.3 利用promise的拓扑特性做有趣的事 —— 有向图的最短路径另类求值

3-5.png

图3-5

如上这个有向图,要求0到3的最短路径,那么你可能第一想到的是Dijkstra算法、Floyd算法等等。

那么利用promise在3.2节中讲的特性,刚好可以用来求最短路径的值。但这里只是求值(玩玩),不能代替“最短路径算法”。上代码:

 1 var Promise = require('bluebird');2 3 var _base = 10;  // 等待时间基数4 5 var dot0 = new Promise(function (resolve) {6     return resolve('0');7 });8 9 var dot0_2 = dot0.then(function () {
10     return new Promise(function (resolve) {
11         setTimeout(function() {
12             return resolve('0');
13         }, 5 * _base);
14     });
15 });
16 
17 var dot0_3 = dot0.then(function () {
18     return new Promise(function(resolve) {
19         setTimeout(function () {
20             return resolve('0');
21         }, 30 * _base);
22     });
23 });
24 
25 var dot2 = Promise.race([dot0_2]);
26 
27 var dot2_1 = dot2.then(function (which) {
28     return new Promise(function (resolve) {
29         setTimeout(function () {
30             return resolve(which + ' 2');
31         }, 15 * _base);
32     });
33 });
34 
35 var dot2_5 = dot2.then(function (which) {
36     return new Promise(function (resolve) {
37         setTimeout(function () {
38             return resolve(which + ' 2');
39         }, 7 * _base);
40     });
41 });
42 
43 var dot5 = Promise.race([dot2_5]);
44 
45 var dot5_3 = dot5.then(function (which) {
46     return new Promise(function (resolve) {
47         setTimeout(function () {
48             return resolve(which + ' 5');
49         }, 10 * _base);
50     });
51 });
52 
53 var dot5_4 = dot5.then(function (which) {
54     return new Promise(function (resolve) {
55         setTimeout(function () {
56             return resolve(which + ' 5');
57         }, 18 * _base);
58     });
59 });
60 
61 var dot1 = Promise.race([dot2_1]);
62 
63 var dot1_4 = dot1.then(function (which) {
64     return new Promise(function (resolve) {
65         setTimeout(function () {
66             return resolve(which + ' 1');
67         }, 8 * _base);
68     });
69 });
70 
71 var dot4 = Promise.race([dot1_4, dot5_4]);
72 
73 var dot4_3 = dot4.then(function (which) {
74     return new Promise(function (resolve) {
75         setTimeout(function () {
76             return resolve(which + ' 4');
77         }, 4 * _base);
78     });
79 });
80 
81 var dot3 = Promise.race([dot0_3, dot4_3, dot5_3])
82     .then(function (str) {
83         console.log('result: ', str + ' 3');
84     });
代码3-6

// 输出结果:
// 0 2 5 3

如果我们把2->1边的权值改成4,即把第31行代码的15改成4,那么输出结果会是 : 0 2 1 4 3

换种写法(结果一样):

 1 var Promise = require('bluebird');2 3 var _base = 10;4 // key表示顶点,值表示出边5 var digram = {6     '0': { '2': 5, '3': 30 },7     '2': { '1': 15, '5': 7 },8     '5': { '3': 10, '4': 18 },9     '1': { '0': 2, '4': 8 },
10     '4': { '3': 4 },
11     '3': {}
12 };
13 var order = ['0', '2', '5', '1', '4', '3'];
14 var startDot = '0';
15 var endDot = '3';
16 
17 var promiseMap = {};
18 function _buildMap() {
19     for(var dot in digram)
20         promiseMap[dot] = {_promise: undefined, _in: [], _out: []};
21     for(var i = 0 ; i < order.length; ++i) {    // 这里不能用 for(var dot in digram),因为js对map的key会排序,这样取出来的dot顺序是0、1、2、3、4、5
22         var dot = order[i];
23         if (dot == startDot) {
24             promiseMap[dot]._promise = Promise.resolve();
25         } else if (dot == endDot) {
26             var localdot = dot;
27             promiseMap[dot]._promise = Promise.race(promiseMap[dot]._in)
28                 .then(function (str) {
29                     console.log('result: ', str + ' ' + localdot);
30                 });
31             continue;
32         } else {
33         debugger;
34             promiseMap[dot]._promise = Promise.race(promiseMap[dot]._in);
35         }
36         for(var edge in digram[dot]) {
37             var edgePromise = 
38                 promiseMap[dot]._promise.then(function (which) {
39                     var self = this;
40                     return new Promise(function (resolve) {
41                         setTimeout(function () {
42                             return resolve( (which ? which + ' ' : '') + self.dot);
43                         }, digram[self.dot][self.edge] * _base);    // 这里不能直接访问外层dot、edge,因为异步函数被调用的时候值已经被改变,也无法通过for循环里面保存tmpdot、tmpedge的办法,因为js没有块级作用域,es6新标准有块级作用域
44                     });
45                 }.bind({dot: dot, edge: edge}));
46             promiseMap[dot]._out.push(edgePromise);
47             promiseMap[edge]._in.push(edgePromise);
48         }
49     }
50 }
51 _buildMap();
代码3-7

// 输出结果:

// 0 2 5 3


3.4 .then链条的结构

那么通过3.1、3.2节的理解,我们知道了,一个.then链条里面的结构并不是这样:

3-6.png

图3-6

这是在同一个promise对象上多次.then的情况(代码3-5)。

而依次.then的链条(代码3-3 / 代码3-4)是这样的:

3-7.png

图3-7

就是说如果这样的代码,不使用同一个promise对象,去.then两次,那么3.1中_addCallbacks的结构只会用到【this._promise0、】这一组,而不会有【this[base + index]】这些数据。


3.5 Promise.prototype._target()

3.1节留了一个疑问,在调用promise.then注册一个回调函数的时候,不是通过“ this._addCallbacks() ” 而是通过 “target._addCallbacks() ”,那么这个target是什么?
通过上几节,了解了内部链条保存的细节,现在来看一下target。

看个示例代码:

3-8.png

图3-8

那么通过app2.js,可以看到一般情况下,aPromise._target() 取到的target是this对象。通过target(aPromise)调用_addCallbacks时,bPromise是存在aPromise._promise0里面的。
通过app3.js,可以发现,当对aPromise使用一个pending状态的cPromise对象进行resolve时,aPromise._target()取到的target会变成cPromise,后续通过aPromise.then所创建的bPromise对象也都是通过target(cPromise)进行_addCallbacks的,这个时候aPromise._promise0就是undefined,而cPromise._promise0就是bPromise。

那么这里target的变动与promise链条的迁移如何实现呢?这里涉及到解决(settle)一个promise对象的细节,第4.3.1.1节会再讲到。



4. promise对象的resolve细节 —— 解决阶段(.resolve)

4.1 resolve一个promise对象的几种情况

看下示例代码:

var Promise = require('bluebird');var aPromise = new Promise(function (resolve) {return resolve();  // resolve的调用可能在任何异步回调函数里面
});var bPromise = aPromise.then(function () {var dPromise = Promise.resolve();return dPromise;
});var cPromise = bPromise.then(function () {console.log('cPromise was resolved');
});
代码4-1
  1. 构造函数的回调函数里面,通过resolve()由我们手动触发解决,例如上面的 aPromise。resolve可能在任何异步回调函数里面被调用。
  2. 通过Promise.resolve()创建一个已经被解决的promise对象
  3. then函数注册的回调函数,会在上游promise对象被解决掉之后,由promise的机制触发后续promise对象被解决。比如aPromise被resolve之后,bPromise、cPromise 由Promise的机制进行解决。

这几种情况的细节在4.3节讲。


4.2 Promise的队列管理对象 —— async

async是Promise用来管理promise链中所有promise对象的settle 的一个单例对象,在async.js文件:

4-1.png

图4-1

async提供两个接口:

  1. settlePromises:接收一个promise对象,针对4.1节中的情况1,调用async.settlePromises去把要settle的promise对象入队
  2. invoke:接收一个回调函数的相关参数,针对4.1节中的情况2,把被settle的上游promise中保存的回调函数(3.1节中的参数组)通过async.invoke,把要执行的回调函数通过this._schedule()去执行

关于this._schedule(),视条件可能有很多种情况,可能不用异步,可能通过process.nextTick(),可能通过setTimeout(fn, 0),可能通过setImmediate(fn) 等等。
schedule的各种实现在schedule.js文件。
在4.3.2讲解的例子中,就是通过process.nextTick()实现的。


4.3 resolve一个promise链的细节

针对4.1节讲的几种情况,进行详细说明。

4.3.1 构造函数里的resolver

来看代码:

4-2.png

图4-2

看右上角的示例代码,右下角是输出结果,为什么“step 2”不是在“step 1”之前呢?可以知道构造一个Promise对象时,传进去的函数(也即源码里面的resolver)是被同步执行的(如果是异步执行的,那么“step 1”必定在“step 2”之后),这也意味着,如果在该回调函数里面同步调用resolve(),那么该Promise对象被创建之后就已经是fulfilled状态了。【看step 2 的输出】。
可以从左边的源码看到,传给构造函数的回调函数是被同步执行的。
可以看出构造函数的参数 —— resolver回调函数“step 1”被调用的时机。

那段代码有点绕,可以来剖析一下。

Promise.prototype._resolveFromResolver = function (resolver) {
...var r = tryCatch(resolver)(function(value) {if (promise === null) return;promise._resolveCallback(value);promise = null;}, function (reason) {if (promise === null) return;promise._rejectCallback(reason, synchronous);promise = null;});
...
};
代码4-2

这里的tryCatch()暂时忽略它,下面讲捕获异常时讲到。这里完全可以看成:

    var r = resolver(function(value) {if (promise === null) return;promise._resolveCallback(value);promise = null;}, function (reason) {if (promise === null) return;promise._rejectCallback(reason, synchronous);promise = null;});
代码4-3

resolver就是我们new Promise时传进去的回调函数:

var aPromise = new Promise(function (resolve) {console.log('step 1');return resolve();
});
代码4-4

而我们传进去的回调函数的resolve参数,是bluebird调用resolver时传出来给我们的回调函数:

function(value) {if (promise === null) return;promise._resolveCallback(value);promise = null;
}
代码4-5

同理,代码4-3中那个function (reason) {} 也即平时new Promise(function (resolve, reject) {}) 时传出来的reject函数。

这样,当我们new Promise时,在传进去的resolver里面调用resolve()时(不管是同步还是在异步回调函数里面),实际上就是调用了代码4-5这个函数。
而value就是我们调用resolve()时传进去的解决值,这个值可以被传递给.then()注册的回调函数的参数。
所以resolve()实际上调用的是promise._resolveCallback(value)。在这个函数里面,去修改当前promise对象的状态为fulfilled。

4.3.1.1 promise._resolveCallback() 与value

在3.5中,aPromise的resolver里面,最终是通过resolve(cPromise) 去解决aPromise的,而这个cPromise是一个处于pending状态的promise对象。
然后就说到aPromise._target() 变成了cPromise。并且后续通过aPromise.then()注册进去的链条都挂在cPromise对象上。
那么resolve(cPromise)实际上就是aPromise._resolveCallback(value)中的value=cPromise。

Promise.prototype._resolveCallback = function(value, shouldBind) {if (this._isFollowingOrFulfilledOrRejected()) return;if (value === this)return this._rejectCallback(makeSelfResolutionError(), false, true);var maybePromise = tryConvertToPromise(value, this);if (!(maybePromise instanceof Promise)) return this._fulfill(value);var propagationFlags = 1 | (shouldBind ? 4 : 0);this._propagateFrom(maybePromise, propagationFlags);var promise = maybePromise._target();if (promise._isPending()) {var len = this._length();for (var i = 0; i < len; ++i) {promise._migrateCallbacks(this, i);}this._setFollowing();this._setLength(0);this._setFollowee(promise);} else if (promise._isFulfilled()) {this._fulfillUnchecked(promise._value());} else {this._rejectUnchecked(promise._reason(),promise._getCarriedStackTrace());}
};
...
Promise.prototype._fulfill = function (value) {if (this._isFollowingOrFulfilledOrRejected()) return;this._fulfillUnchecked(value);
};
...
Promise.prototype._fulfillUnchecked = function (value) {if (value === this) {var err = makeSelfResolutionError();this._attachExtraTrace(err);return this._rejectUnchecked(err, undefined);}this._setFulfilled();this._settledValue = value;this._cleanValues();if (this._length() > 0) {this._queueSettlePromises();}
};
代码4-6

可以看到当value不是Promise时,直接return this._fulfill(value)。并且最终在_fulfillUnchecked()里面_setFulfilled(),这是第二节的那些状态设置和检验函数。
当value是pending状态的Promise时,就会把当前的aPromise _setFollowing(),并且_setFollowee(cPromise)。(实际上这里也并不一定是cPromise,如果cPromise还有其他followee的话,这里是先通过cPromise._target()取出来的cPromise所跟随的最终promise对象。)
_setFollowing()也是第二节的状态设置函数。_setFollowee()就是给当前promise对象设置一个跟随对象。
看下面代码,实际上就是this._rejectionHandler0。
而注意到this._target()函数,事实上不是返回一个属性,而是判断当前的promise是不是被设置成“following”状态了,是的话返回“跟随对象”,一直循环到最终那个promise。

Promise.prototype._target = function() {var ret = this;while (ret._isFollowing()) ret = ret._followee();return ret;
};Promise.prototype._followee = function() {return this._rejectionHandler0;
};Promise.prototype._setFollowee = function(promise) {this._rejectionHandler0 = promise;
};
代码4-7

再次看回_resolveCallback()的实现,当value是pending状态的promise时,在给aPromise设置following状态并且设置与cPromise的跟随关系之前,还有一个cPromise._migrateCallbacks(aPromise, i)的过程。
这migrate的就是3.1中讲的多次.then()时保存的那对参数组,其中第四个参数是.then()时创建的promise。
现在follower(即aPromise)上.then()的后续参数组都被迁移到followee(即cPromise)上面。
而且这些被迁移的参数组中的第四个参数被_setIsMigrated()。

Promise.prototype._migrateCallbacks = function (follower, index) {var fulfill = follower._fulfillmentHandlerAt(index);var reject = follower._rejectionHandlerAt(index);var progress = follower._progressHandlerAt(index);var promise = follower._promiseAt(index);var receiver = follower._receiverAt(index);if (promise instanceof Promise) promise._setIsMigrated();this._addCallbacks(fulfill, reject, progress, promise, receiver, null);
};
代码4-8

4.3.2 .then注册的回调函数被触发的机制 —— aPromise.then时,已是fulfilled状态

那再来看上图4-2的示例代码中,通过aPromise.then()创建的bPromise对象。
我们知道aPromise 变成fulfilled之后,通过aPromise.then注册的bPromise也是会被settle的。而在aPromise.then的时候,aPromise本身已经是fulfilled状态的。那么通过“step 3”的输出、以及“step 3”和“step 4”的顺序,可以知道通过.then()创建的promise对象的onFulfilled函数是被异步执行的(不管.then的时候aPromise是否fulfilled),而且通过“step 5”的输出,我们可以猜到这个异步大致也是通过process.nextTick()处理的。

在图3-1中知道aPromise.then()最终调用了async.invoke(target._settlePromiseAtPostResolution, target, callbackIndex);
这个callbackIndex就是promise链条的index。
而从4.2中,知道async.invoke()最终导致了该回调函数被通过process.nextTick()异步执行了。
同时可以知道,step 5和step 4的顺序是不一定的,因为通过setTimeout、setImmediate都不一样。而且不同版本的node,这几个函数的执行顺序也不一定一样。

4.3.3 .then注册的回调函数被触发的机制 —— aPromise.then时,处于pending状态

4.3.2中讲了aPromise为已经fulfilled时,.then产生的后续promise对象在 async.invoke(target._settlePromiseAtPostResolution, target, callbackIndex)中通过process.nextTick进行settle。
那么aPromise.then产生bPromise时,aPromise还是pending状态,这时后续的bPromise对象的settle要等到aPromise被手动resolve()时再触发。
在代码4-6中,知道aPromise对象被通过resolve(value) settle掉时,最终调用_fulfillUnchecked()。
里面再调用了this._queueSettlePromises()。在这里面,把后续的promise对象一一解决。

Promise.prototype._queueSettlePromises = function() {async.settlePromises(this);this._setSettlePromisesQueued();
};
代码4-9

同样是通过async来管理。

Async.prototype.settlePromises = function(promise) {if (this._trampolineEnabled) {AsyncSettlePromises.call(this, promise);} else {this._schedule(function() {promise._settlePromises();});}
};
代码4-10

4.3.4 .then注册的回调函数被触发的机制 —— bPromise.then时,bPromise本身就是.then产生的一个promise对象

在4.3.3 中解决了bPromise时,在async.settlePromises()里面又反过来调用bPromise._settlePromises()。这会激发bPromise解决后续链条。

Promise.prototype._settlePromises = function () {this._unsetSettlePromisesQueued();var len = this._length();for (var i = 0; i < len; i++) {this._settlePromiseAt(i);}
};
代码4-11

4.3.5 总结.then链条的解决

那么结合4.3.1 - 4.3.4,我们看这样一个promise链的解决时机是怎样的,示例代码:

javascript var aPromise = new Promise(function (resolve) { return resolve(); }) .then(function () { // 假设这里创建的是bPromise // task B }) .then(function () { // 假设这里创建的是cPromise // task C });

代码4-12

解决顺序:

  1. aPromise创建之时,同步执行了构造函数的回调函数,同步执行了resolve。这个是4.3.1节的情况。

  2. bPromise在创建的时候,aPromise已经为fulfilled状态,这时通过async.invoke(target._settlePromiseAtPostResolution, target, callbackIndex),把bPromise的settle任务放到process.nextTick。这个是4.3.2节的情况。

  3. cPromise在创建的时候,注意这里cPromise不是通过aPromise.then产生的,而是bPromise.then产生的,那么这个时候bPromise还是pending状态的,所以cPromise的settle任务是4.3.5节里面的情况。



5. tryCatch 处理

在4.3.1中暂时忽略了tryCatch(),现在来看看实现。
在util.js文件:

var errorObj = {e: {}};
var tryCatchTarget;
function tryCatcher() {try {var target = tryCatchTarget;tryCatchTarget = null;return target.apply(this, arguments);} catch (e) {errorObj.e = e;return errorObj;}
}
function tryCatch(fn) {tryCatchTarget = fn;return tryCatcher;
}
代码5-1

所以在下面这段代码里面

Promise.prototype._resolveFromResolver = function (resolver) {
...var r = tryCatch(resolver)(function(value) {if (promise === null) return;promise._resolveCallback(value);promise = null;}, function (reason) {if (promise === null) return;promise._rejectCallback(reason, synchronous);promise = null;});
...
};

实际上tryCatch只是转换了一下error的形势。把throw 出来的error,变成了return 回来的一个自定义的errorObj。
这样,如果你没有捕获异常,这里面的异常也不会变成node的未捕获异常,而是bluebird的内部机制帮你捕获了。
而如果你没有在promise链条的末端catch(),那么bluebird帮你捕获的未解决异常最终会输出。
看下面示例代码。

var aPromise = new Promise((resolve, reject) => {console.log(aaa.abc);
});输出:
Unhandled rejection ReferenceError: abc is not definedat ..../app.js:7:15at tryCatcher (..../node_modules/bluebird/js/main/util.js:26:23)at .......

如果手动.catch()再输出:

var aPromise = new Promise((resolve, reject) => {console.log(aaa.abc);
}).catch((err) =>  {console.error(err);
});输出:
ReferenceError: abc is not definedat app.js:7:15at tryCatcher (/...../node_modules/bluebird/js/main/util.js:26:23)

在resolver里面返回error,也可以通过return reject(err); 返回的异常也会出现在Promise链条中。

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

相关文章

  1. Node.js最新Web技术栈(2015年5月)

    2019独角兽企业重金招聘Python工程师标准>>> nodejs是比较简单的,只有你有前端js基础,那就按照我的办法来吧!一周足矣 推荐技术栈 express 4.x (express最新版本,初学者先别去碰koa) mongoose(mongodb) bluebird(Promise/A+实现) jade(视图层模板) moc…...

    2024/4/24 13:31:51
  2. 白洁血战Node.js并发编程 01 状态机

    这一篇是这个系列的开篇,没有任何高级内容,就讲讲状态机。 状态机 状态机是模型层面的概念,与编程语言无关。它的目的是为对象行为建模,属于设计范畴。它的基础概念是状态(state)和事件(event)。 对象的内部结构描述为一组状态S1, S2, ... Sn,它的行为的trigger,包括…...

    2024/4/24 13:31:50
  3. 一些当前 Node.js 中最流行 ES6 特性的 benchmark (V8 / Chakra)

    前言 项目 github 地址:https://github.com/DavidCai1993/ES6-benchmark 如果有想要增加的特性 benchmark ,欢迎更新benchmarks/ ,然后 PR 。 环境 CPU: Intel Core(TM) i5-2410M 2.30GHz Memory: 8GB 1600 MHz DDR3 Node.js: 5.9.0 / Node-chakracore 6.0.0-pre5 大致结论 …...

    2024/5/8 19:55:00
  4. nodejs之mysql事务封装与使用

    nodejs之mysql的事务封装简介所需模块文件结构干货部分1 此部分为mysql初始化配置信息:2 数据库连接3 orderModel的封装和对数据库的使用4 model使用到这里我们就结束了,如果你喜欢,那谢谢你的浏览,如果不喜欢,那请留下你的建议。 简介 本文章主要针对nodejs中MySQL模块下…...

    2024/4/24 13:31:48
  5. 利用promise写出更加优美的nodejs程序

    利用promise写出更加优美的nodejs程序 时间 2014-04-28 10:42:17 sundaqing的个人空间 原文 http://my.oschina.net/sundq/blog/227410 主题 Node.js 什么是 promisepromise 一个标准,它描述了异步调用的返回结果,包括正确返回结果和错误处理。关于详细的说明文档可以参…...

    2024/4/24 13:31:48
  6. 进击Node.js基础(二)promise

    一.Promise—Promise似乎是ES6中的规范PROMISE的语言标准,PROMISE/A+规范,如何使用,在什么场景下使用 Promise时JS对异步操作场景提出的解决方案(回调,观察者模式等等都是一些方案) Promise以同步的方式写代码,执行异步的操作,Promise对象和普通JS对象没什么区别,它有…...

    2024/4/24 13:31:46
  7. Node.Js学习笔记(二):NPM包管理工具使用详解

    文章目录0 NPM(Node Package Manager)1 如何安装一个包?2 如何使用一个包?3 NPM的包与源代码管理4 语义化版本控制5 查看依赖库的版本6 查看包的注册信息7 安装特定版本的包8 升级本地包9 开发中使用的依赖库10 删除包11 操作全局包 0 NPM(Node Package Manager) NPM:node包…...

    2024/4/24 13:31:45
  8. 避免Node.js中回调地狱

    为了解决这个阻塞问题,JavaScript严重依赖于回调,这是在长时间运行的进程(IO,定时器等)完成后运行的函数,因此允许代码执行经过长时间运行的任务。downloadFile(example.com/weather.json, function(err, data) { console.log(Got weather data:, data); });但是,问题来…...

    2024/5/6 13:37:52
  9. 安装NodeJS及web服务器(运行js,不需要在浏览器执行js)

    Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\Administrator>cd C:\workspace\angular-quickstart C:\workspace\angular-quickstart>npm install npm WARN package.json angular2-quickstart@1.0.0 No descrip…...

    2024/5/6 11:22:55
  10. Node.js最新Web技术栈(2016年4月)

    2019独角兽企业重金招聘Python工程师标准>>> Node.js最新Web技术栈(2016年4月) 上一次的发布的是精华 Node.js最新Web技术栈(2015年5月),感谢大家喜爱,值此koa2.0发布后,决定再次升级技术栈 Node.js是比较简单的,只有你有前端js基础,那就按照我的办法来吧!…...

    2024/4/15 3:55:09
  11. 2017 nodeJS

    一、版本迅速更新 Chrome浏览器已经蹦到57版本了,是名副其实的版本帝,作为兄弟的Node.js也一样,1.0之前等了6年,而从1.0到8.0,只用了2年时间,现在已到9以上了 我们就数一下 从v0.1到0.12用了6年 2015-01-14发布了v1.0.0版本(io.js) 2.x(io.js) 3.x(io.js) 2015年09…...

    2024/4/20 12:20:31
  12. 10 Node.js——初识promise

    首先用最简单的方式实现一个动画效果<!doctype> <html> <head> <title>Promise animation</title> <style type="text/css">.ball {width: 40px;height: 40px;border-radius: 20px;}.ball1 {background: red;}.ball2 {backgroun…...

    2024/5/6 16:45:31
  13. Node.js制作爬取简书内容的爬虫

    用了Nodejs制作了简单的爬虫,爬取了简书的文章内容,代码中contentIds有几个,就爬取了几个网页的内容。 可以直接看结尾截图的结果。下面两张截图,是说明怎么用cheerio获取自己想要的内容。 下面截图,是代码中:第46行,利用cheerio模块,获取版块标题内容下面截图:代码第…...

    2024/4/20 4:21:38
  14. Node.js之Promise

    2015年发布了ES6标准,所谓 Promise,就是ES6标准的一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。有了 Promise 对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌…...

    2024/4/15 3:55:05
  15. 100行搭建一个node.js简单的静态站点生成器

    最近我的一个同事想开一个博客,问我有没有什么建议。在研究了一些静态站点生成器和博客引擎后,我觉得 Hugo 是个很不错的选择。然而,我同事还有一些其它需求,比如想让博客都有自定义 URL 以及自定义 CSS 主题。虽然用 Hugo 也能实现这些要求,但是我还是决定跳过学习使用 H…...

    2024/4/15 3:55:04
  16. 全栈工程师之路-Node.js

    2019独角兽企业重金招聘Python工程师标准>>> 全栈工程师之路-Node.js 高可用架构专用 原文[高可用架构] https://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=405001493&idx=1&sn=f0ecab9b31bad83fb065ac37bb728245&scene=1&srcid=0324iTR…...

    2024/4/15 3:55:03
  17. node后端遇到的坑和学习过程

    node.js是非阻塞异步单线程事件驱动的后端型支持高并发的脚本语言。每次的事件只要把javascript脚本语言编译后即可继续执行下个事件,编译后的javascript交给底层libuv来调用node.js的api,而node的底层是多线程的,所以只要执行完事件即可使用回调函数告诉用户执行完成!!!…...

    2024/5/6 6:34:09
  18. 【Nodejs】Nodejs入门必知

    https://i5ting.github.io/How-to-learn-node-correctly/#11.3.2. 安装Node.js环境3m安装法nvm(node version manager)【需要使用npm安装,替代品是yrm(支持yarn)】nrm(node registry manager)【需要使用npm安装,替代品是yrm(支持yarn)】npm(node packages manager)…...

    2024/5/6 17:48:42
  19. Bluebird中promisify的用法

    Bluebird中promisify的用法之前应项目需要,在node.js中引入bluebird包学习使用Promise。其链式结构的异步操作容易理解,也减少了回调函数的多层嵌套。网络上对Promise的介绍已经比较全面,这里不再赘述。本文主要从实际工作遇到的问题出发,介绍其promisify方法的使用。New一…...

    2024/5/6 6:41:09
  20. NPM酷库:bluebird Promise工具库

    NPM酷库,每天两分钟,了解一个流行NPM库。 昨天我们了解了增强版Promise库:q。q库实现了比ES2015标准更多的Promise方法,今天我们继续学习另一个功能强大的Promise工具库:bluebird。 bluebird 首先,和q库一样,bluebird也是一个增强版本的Promise库,可以直接require后替换…...

    2024/4/24 13:31:40

最新文章

  1. DHCP协议:动态主机配置协议

    目录 概述 DHCP的功能 DHCP系统组成 DHCP报文分析 DHCP报文格式 DHCP选项分析 DHCP运行机制 客户端与服务器交互以分配IP地址 客户端与服务器交互以重用原来分配的地址 DHCP租约更新 租约释放 客户端状态转换 构造和发送DHCP报文 中继代理 总结 概述 DHCP&#x…...

    2024/5/9 2:15:21
  2. 梯度消失和梯度爆炸的一些处理方法

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

    2024/5/7 10:36:02
  3. 从头开发一个RISC-V的操作系统(二)RISC-V 指令集架构介绍

    文章目录 前提ISA的基本介绍ISA是什么CISC vs RISCISA的宽度 RISC-V指令集RISC-V ISA的命名规范模块化的ISA通用寄存器Hart特权级别内存管理与保护异常和中断 目标&#xff1a;通过这一个系列课程的学习&#xff0c;开发出一个简易的在RISC-V指令集架构上运行的操作系统。 前提…...

    2024/5/5 1:33:57
  4. 【图论】知识点集合

    边的类型 neighbors(邻居)&#xff1a;两个顶点有一条共同边 loop&#xff1a;链接自身 link&#xff1a;两个顶点有一条边 parallel edges&#xff1a;两个顶点有两条及以上条边 无向图 必要条件&#xff1a;删掉顶点数一定大于等于剩下的顶点数 设无向图G<V,E>是…...

    2024/5/7 21:13:52
  5. 【外汇早评】美通胀数据走低,美元调整

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

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

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

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

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

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

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

    2024/5/7 14:25:14
  9. 【外汇早评】日本央行会议纪要不改日元强势

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

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

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

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

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

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

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

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

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

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

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

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

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

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

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

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

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

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

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

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

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

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

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

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

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

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

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

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

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

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

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

    2024/5/4 23:54:56
  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