Node.js ES6承诺-在承诺链中调用同步函数
我目前正在试验承诺,有一个非常基本的问题 在承诺链中,调用同步函数是一种不好的做法吗?例如:Node.js ES6承诺-在承诺链中调用同步函数,node.js,asynchronous,promise,es6-promise,Node.js,Asynchronous,Promise,Es6 Promise,我目前正在试验承诺,有一个非常基本的问题 在承诺链中,调用同步函数是一种不好的做法吗?例如: .then(function(results) { if(checkIfResultInMemory(results) === true){ return getTotalFromMemory() } return results; }) 或者我的同步函数也应该重构以返回承诺 在承诺链中,调用同步 功能 不,这根本不是一个坏习惯。这是许多预期和有用的实践之
.then(function(results) {
if(checkIfResultInMemory(results) === true){
return getTotalFromMemory()
}
return results;
})
或者我的同步函数也应该重构以返回承诺
在承诺链中,调用同步
功能
不,这根本不是一个坏习惯。这是许多预期和有用的实践之一
您可以完全自由地调用承诺链中的同步函数(从.then()
处理程序中)或异步函数,然后返回新的承诺
当您从.then()
处理程序返回某个内容时,您可以返回一个值(成为父承诺的解析值),也可以返回另一个承诺(链接到上一个承诺上),或者抛出一个类似于返回被拒绝承诺的承诺(承诺链被拒绝)
因此,这意味着您可以调用同步函数并从中获取值,或者调用异步函数并获取另一个承诺,然后从.then()
处理程序返回
所有这些同步的事情都是完全合法的,每个都有自己的目标。以下是.then()
处理程序中的一些同步事件:
// modify resolved value
someAsync().then(function(val) {
return val + 12;
});
// modify resolved value by calling some synchronous function to process it
someAsync().then(function(val) {
return someSynchronousFunction(val);
});
// synchronously check the value and throw to change the promise chain
// to rejected
someAsync().then(function(val) {
if (val < 0) {
throw new Error("value can't be less than zero");
}
return val;
});
// synchronously check the value and return a rejected promise
// to change the promise chain to rejected
someAsync().then(function(val) {
if (val < 0) {
return Promise.reject("value can't be less than zero");
}
return val;
});
然后
回调函数应该:
- 还债
- 返回同步值(或未定义)
- 抛出同步错误
然后处理程序内部”?我不明白你的意思。编写特定部分的代码。同步函数可能会重复永不使用的承诺。非常感谢@jfriend00-非常有用!谢谢你的时间。为什么要投否决票?对一个被普遍接受的答案投反对票,而没有任何附带的评论来解释为什么你认为它值得投反对票,这对社区并没有多大贡献。如果你解释,那么作者可以改进他们的答案来解决你的问题,并为所有人改进答案。Driveby downvoting无助于改善社区其他人的状况。答案很好。比神话中的“永远不做承诺”要好得多。谢谢。@Kim-谢谢,但这里要明确的是,这些不是“同步承诺”。所有.then()
处理程序总是异步调用,即使底层操作是同步的。而且,我认为不用说,只有在至少涉及一个异步操作的情况下,才会使用承诺。否则,承诺只会使纯同步代码的事情复杂化。但是,从承诺链中调用一些同步代码是完全可以的。@jfriend00我想我这么称呼他们有点懒。我明白了,谢谢。