Node.js Nodejs、Express和Promises——我是否正确地实现了这一点?

Node.js Nodejs、Express和Promises——我是否正确地实现了这一点?,node.js,express,promise,Node.js,Express,Promise,我编写了一个快速路由,其中输入数据按顺序通过3个不同的函数进行解析——经过进一步测试后,我意识到这是在排队请求,并一次返回一个请求 我现在已经做出了函数返回承诺,并将它们链接到route函数中;我看到的所有Promise示例都是围绕小函数构建的,在这些小函数中,如何实现错误处理是显而易见的。我的实现现在似乎可以工作了,但我想知道a)在这里使用承诺是否正确,b)我的实现是否正确/我如何处理错误 功能承诺功能1(){ 返回新承诺(功能(解决、拒绝){ //for循环{ //if语句{ arr.pus

我编写了一个快速路由,其中输入数据按顺序通过3个不同的函数进行解析——经过进一步测试后,我意识到这是在排队请求,并一次返回一个请求

我现在已经做出了函数返回承诺,并将它们链接到route函数中;我看到的所有Promise示例都是围绕小函数构建的,在这些小函数中,如何实现错误处理是显而易见的。我的实现现在似乎可以工作了,但我想知道a)在这里使用承诺是否正确,b)我的实现是否正确/我如何处理错误

功能承诺功能1(){
返回新承诺(功能(解决、拒绝){
//for循环{
//if语句{
arr.push(等);
}
}
解决(arr);
});
}
功能承诺功能2(arr){
返回新承诺(功能(解决、拒绝){
//if语句{
}
//嵌套{
//循环{
}
}
//过程数据
解析(数据);
});
}
应用程序post('/route',功能(请求、回复){
//准备数据并声明变量,然后:
var var1=promiseFunction1();
var1.then(函数(结果){
var2=结果;
var-nextVal=promiseFunction2(var2);
nextVal.then(功能(数据){
res.send(数据);
});
});
}
我只是有点犹豫是否调用这个“正确”,因为我寻找的每个承诺示例要么等待API调用,要么等待函数解析,而不仅仅是一些耗时的循环(那么我在这些条件下实现承诺对吗?),而且我看到的每个示例都处理Promise函数内部的错误,但这通常是特定于从Promise本身内部调用的函数的-我认为在我的示例中,我应该处理Promise函数的错误,而不是在route函数内部调用它们


感谢您的帮助。

您的
promiseFunction
都不希望异步执行任何操作,因此它们不需要构造承诺。相反,您只需调用这些函数,并让它们同步返回所需的值:

注意,因为这里没有异步,所以您需要
返回
,而不是在结尾处
解析

然后,在
.post
中,您可以调用那些返回非承诺值的函数,并立即使用该值,而无需先调用
然后再调用

app.post('/route', function(req,res){
  const result = myFn1();
  const nextVal = promiseFunction2(var2);
  res.send(nextVal);
});
如果这些函数可能会抛出错误,因为它们是同步的,请将它们包围在
try
/
catch
中:

app.post('/route', function(req,res){
  try {
    const result = myFn1();
    const nextVal = myFn2(result );
    res.send(nextVal);
  } catch(e) {
    // handle errors
  }
});

这就是我最初编写它的方式,但是它在res.send()之前一直阻止请求如果我不需要实现承诺,我猜我只是有一个变量范围问题。如果有实际的阻塞发生,听起来像是在
myFn1
myFn2
中进行的计算太昂贵了。它不应该与承诺有任何关系。承诺不是hat从一开始就不是异步的,不会有任何帮助。是的,它是完全阻塞的-一个请求在解析前的那一刻才会开始。我确实发现了一个声明不正确的变量,尽管我认为这是罪魁祸首,但我会测试并发回。无论如何,您已经为我澄清了promise的用法-我看到的示例中的错误处理反对异步操作(因此我对如何实现它感到困惑)。谢谢!我想这是我的问题:假设我的路由主要由一个已经存储在内存中的数组的数据操作组成,那么按照提交的顺序逐个处理请求真的没有办法吗?不涉及I/O,也没有任何东西可以异步运行n告诉。没错,数据处理占用了太多的CPU时间。这就像运行一个
循环10000000次-把它变成承诺没有帮助,解释器需要完全完成一个昂贵的同步调用,然后才能继续下一个。
app.post('/route', function(req,res){
  try {
    const result = myFn1();
    const nextVal = myFn2(result );
    res.send(nextVal);
  } catch(e) {
    // handle errors
  }
});