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我想我这么称呼他们有点懒。我明白了,谢谢。