背景
我有一个通过OAuth 2.0协议通过云服务进行身份验证的应用。我使用第三方库来发出HTTP请求,并将调用包装在Promise
中。我还确保此调用可以超时。代码基本上如下所示:
var authenticate = new Promise (resolve, reject) {
service.authenticate(callback); // The third party library HTTP request
if (responseData === 'authenticated') {
resolve();
} else {
reject();
}
}
var timeout = new Promise (resolve, reject) {
setTimout (function() {reject();}, 2000}
}
Promise.race([authenticate, timeout])
.then(resolved)
.catch(rejected);
如果前一个应用被拒绝,应用程序会立即进行新的身份验证尝试。这意味着新的Promise
会立即分配给var authenticate
。这意味着分配给Promise
的前面的authenticate
会被垃圾收集(我猜 - 如果我错了,请纠正我)。
问题
如果云服务使用与收集的垃圾Promise
相关的访问令牌进行响应,会发生什么?
答案 0 :(得分:0)
承诺不是垃圾收集。
请注意,resolve
和reject
需要以某种方式传递到执行异步身份验证的函数中,否则以后就无法调用它们,所以我们假设它说: / p>
service.authenticate(resolve, reject);
这很重要,因为为了完成身份验证,该功能显然需要保留函数resolve
和reject
,这反过来使得返回的promise保持活动状态,而不管是否{{ 1}}仍然引用它。
所以,正如人们所希望的那样,承诺将会解决(或拒绝,如果有错误)。
你的代码放弃它的事实并没有改变这一点。
如果它拒绝,则大多数浏览器会在Web控制台中显示有关此未处理拒绝的承诺的错误,因为这被视为编程错误。