我必须履行我的JavaScript承诺吗?
在Node.js环境中,如果我这样做:
var doNoResolve = true; function a() { return new Promise(resolve => { if (doNotResolve) { return } resolve(10); }); } a().then(() => { // I don't want this getting fired });
在传入的请求,这是一个内存泄漏? 如果我使用一个普通的旧callback,如果我没有执行任何callback提供的东西,那么一切都会变好,但是这种感觉可能不是这样的……名字的承诺意味着这是错误的。
如果我必须在doNotResolve为true的情况下返回一个“假承诺”( return { then: () => {} }
)在function a()
而不是“真正的承诺”
特别的用例是一个同构的React.js应用程序,我不想让HTTP请求实际得到(但是我希望我的商店更新到一个导致加载图标出现的状态)。
你为什么要这样做,而不是拒绝?
承诺的好处在于它们允许解决和拒绝,即:
- 不会触发
then
处理程序(除非您提供两个callback,这被认为是不好的做法) - 是否触发
catch
处理程序,它显式处理错误 - 仍然发射
finally
处理程序
你可以简单地做:
function a() { return new Promise((resolve, reject) => { if (doNotResolve) { reject(new Error('Oh noes!')); } resolve(10); }); }
任何好的Promise
实现都会给你一个来自你所称的reject
位置的堆栈跟踪,以帮助你debuggingasynchronous代码,以及调用任何catch / finally处理程序:
a().then(val => { console.log('Got data:', val); }).catch(err => { console.error(err); }).finally(() => { console.log('Done!'); });
从不拒绝或解决承诺将取决于您的实现,将其留在未决的承诺堆栈上,并且当您的页面卸载或节点承诺退出时,很可能会抛出或logging一个错误。 我知道蓝鸟会抱怨,如果你有任何悬而未决的承诺,因为它通常表明你的代码的asynchronous部分内的错误。