我必须履行我的 JavaScript 承诺吗?
Do I have to fulfil my JavaScript promises?
在 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
});
对于传入请求,这是内存泄漏吗?如果我使用的是普通的旧回调,如果我不执行提供的任何回调,一切都会很好,但这感觉可能不是......这个名字 promise暗示这有点不对。
如果我不得不这样做,我可以 return 在 function a()
中使用 "fake promise" (return { then: () => {} }
) 而不是 "real promise" 如果 doNotResolve 为真,但是感觉有点恶心。
特定用例是同构 React.js 应用程序,我不希望 HTTP 实际发出请求(但我确实希望我的商店更新到导致的状态,比如说,一个加载图标出现)。
为什么你会这样做而不是拒绝?
承诺的好处是它们允许解决和拒绝,其中:
- 不触发
then
处理程序(除非您提供两个回调,这被认为是不好的做法)
- 是否触发
catch
处理程序,它明确处理错误
- 仍然触发
finally
处理程序
你可以简单地做:
function a() {
return new Promise((resolve, reject) => {
if (doNotResolve) {
reject(new Error('Oh noes!'));
}
resolve(10);
});
}
任何好的 Promise
实现都会从您调用 reject
的位置为您提供堆栈跟踪 以帮助您调试异步代码,以及调用任何catch/finally 个处理程序:
a().then(val => {
console.log('Got data:', val);
}).catch(err => {
console.error(err);
}).finally(() => {
console.log('Done!');
});
从不拒绝或解决承诺,这取决于您的实现,将其留在未决承诺的堆栈中,并且很可能在您的页面卸载或节点承诺退出时抛出或记录错误。我知道如果您有任何待处理的承诺,Bluebird 会抱怨,因为它通常表示代码的异步部分中存在错误。
在 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
});
对于传入请求,这是内存泄漏吗?如果我使用的是普通的旧回调,如果我不执行提供的任何回调,一切都会很好,但这感觉可能不是......这个名字 promise暗示这有点不对。
如果我不得不这样做,我可以 return 在 function a()
中使用 "fake promise" (return { then: () => {} }
) 而不是 "real promise" 如果 doNotResolve 为真,但是感觉有点恶心。
特定用例是同构 React.js 应用程序,我不希望 HTTP 实际发出请求(但我确实希望我的商店更新到导致的状态,比如说,一个加载图标出现)。
为什么你会这样做而不是拒绝?
承诺的好处是它们允许解决和拒绝,其中:
- 不触发
then
处理程序(除非您提供两个回调,这被认为是不好的做法) - 是否触发
catch
处理程序,它明确处理错误 - 仍然触发
finally
处理程序
你可以简单地做:
function a() {
return new Promise((resolve, reject) => {
if (doNotResolve) {
reject(new Error('Oh noes!'));
}
resolve(10);
});
}
任何好的 Promise
实现都会从您调用 reject
的位置为您提供堆栈跟踪 以帮助您调试异步代码,以及调用任何catch/finally 个处理程序:
a().then(val => {
console.log('Got data:', val);
}).catch(err => {
console.error(err);
}).finally(() => {
console.log('Done!');
});
从不拒绝或解决承诺,这取决于您的实现,将其留在未决承诺的堆栈中,并且很可能在您的页面卸载或节点承诺退出时抛出或记录错误。我知道如果您有任何待处理的承诺,Bluebird 会抱怨,因为它通常表示代码的异步部分中存在错误。