Node.js连续方法调用嵌套回调格式

rai*_*zed 2 node.js

所以我是Node.js的新手,我只是想知道我的代码设置方式是否合理.我来自Java背景,所以嵌套的回调结构是新的.我有一个Node程序运行一堆代码,我分解成不同的方法.问题是需要按顺序调用方法.我的代码现在有这个结构:

functionOne(data, callback(err) {

   functionTwo(data, callback(err) {

      functionThree(data, callback(err) {

          functionFour(data, callback(err) {
             //Code
          });

      });

   });

});
Run Code Online (Sandbox Code Playgroud)

这是非常简约的,但这个结构好吗?使用Java,我将获取所有方法的返回值,然后将它们传递给下一个函数.根据我的理解,到目前为止,我刚刚提到的Java方法是Node.js试图消除的主要内容之一.但无论如何......那个结构看起来还不错,那是不是它的意图呢?只是想确保我一般不会对Node造成任何重大错误.谢谢!

Jos*_*igo 5

如果使用回调模式,您的代码结构看起来很好.但是如果你有兴趣让你的代码更清晰和可读,你想在你的异步函数中使用Promises,所以不要将回调传递给你的函数,你可以这样做:

function asyncFunction (data){
   return new Promise(function(resolve, reject){
       // Do something with data
       // Here you can call reject(error) to throw an error
       resolve();
   });
}
Run Code Online (Sandbox Code Playgroud)

而不是嵌套函数回调,你可以调用Promise的方法.

asyncFunction(data)
.then(function(){
    // Promise resolved
    // Something has been done with data
});
Run Code Online (Sandbox Code Playgroud)

使用Promises,您还可以并行执行异步函数:

Promise.all([asyncFunctionA(data), asyncFunctionB(data), asyncFunctionC(data)])
.then(function(){...});
Run Code Online (Sandbox Code Playgroud)

编辑

如果需要将一个函数的值传递给另一个函数,则代码应如下所示:

asyncFunctionA(data)
.then(function(dataA){
    return asyncFunctionB(dataA);
})
.then(function(dataB){
    return asyncFunctionC(dataB);
})
.then(function(dataC){
// ...
});
Run Code Online (Sandbox Code Playgroud)