Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 跳到主回调,结果是异步瀑布节点js_Javascript_Node.js_Asynchronous - Fatal编程技术网

Javascript 跳到主回调,结果是异步瀑布节点js

Javascript 跳到主回调,结果是异步瀑布节点js,javascript,node.js,asynchronous,Javascript,Node.js,Asynchronous,我是NodeJS新手,正在使用异步瀑布 var methods = function (req, res) { async.waterfall([ func1(req, res), func2, func3 ], mainCallback); }; app.get("/create", function(request, response) { methods(request, response); }); function func1 (somethin

我是NodeJS新手,正在使用异步瀑布

var methods = function (req, res) {
async.waterfall([
    func1(req, res),
    func2,
    func3
], mainCallback);
};

app.get("/create", function(request, response)
{
  methods(request, response);    
});

function func1 (something, res, callback) {
    if(something == 0)
    {
     callback (null, res, somethingelse);
    }
    else
    {
     mainCallback("success");
     }

}

function func2 (something, res, callback) {        
      callback (null, res, somethingmore);        
}

function func3 (something, res, callback) {
      callback (null, res, somethingmore);
}

function mainCallback (error, success)
{
 if (error)
{
    console.log("error");
}

if(success)
{
    //console.log("success");
}

}
在上面的流程中,我可以跳转到带有结果的主回调,但无法向主回调发送更多参数

例如,如果我想从main回调发送响应,那么如何将其作为func1的参数发送

我在func1中尝试了以下操作,但无效

mainCallback("success", response)

请告诉我如何跳过方法func2和func3。还将响应作为参数发送给main allback。

跳过瀑布其余部分的唯一方法是传入err参数

所以调用:
done({something:{val:1}}})
将跳过瀑布的其余部分

var methods = function (req, res) {
async.waterfall([
    func1(req, res),
    func2,
    func3
], mainCallback);
};

app.get("/create", function(request, response)
{
  methods(request, response);    
});

function func1 (something, res, callback) {
    if(something == 0)
    {
     callback (null, res, somethingelse);
    }
    else
    {
     mainCallback("success");
     }

}

function func2 (something, res, callback) {        
      callback (null, res, somethingmore);        
}

function func3 (something, res, callback) {
      callback (null, res, somethingmore);
}

function mainCallback (error, success)
{
 if (error)
{
    console.log("error");
}

if(success)
{
    //console.log("success");
}

}
如果它不是一个真正的错误,您可以将要在最终回调中解析的某个对象作为错误放入,但它将作为结果回调中的第一个参数传递(
mainCallback

编辑
但是,是的,您不应该使用错误作为控制流或中断异步的方法。它应该只用于传播错误。

跳过瀑布其余部分的唯一方法是传入err参数

所以调用:
done({something:{val:1}}})
将跳过瀑布的其余部分

var methods = function (req, res) {
async.waterfall([
    func1(req, res),
    func2,
    func3
], mainCallback);
};

app.get("/create", function(request, response)
{
  methods(request, response);    
});

function func1 (something, res, callback) {
    if(something == 0)
    {
     callback (null, res, somethingelse);
    }
    else
    {
     mainCallback("success");
     }

}

function func2 (something, res, callback) {        
      callback (null, res, somethingmore);        
}

function func3 (something, res, callback) {
      callback (null, res, somethingmore);
}

function mainCallback (error, success)
{
 if (error)
{
    console.log("error");
}

if(success)
{
    //console.log("success");
}

}
如果它不是一个真正的错误,您可以将要在最终回调中解析的某个对象作为错误放入,但它将作为结果回调中的第一个参数传递(
mainCallback

编辑
但是,是的,您不应该使用错误作为控制流或中断异步的方法。它应该只用于传播错误。

不要使用返回/抛出错误来控制执行流,这是一种代码味道

而是按照如下方式重构代码:

function mainCallback(err, res) {
    if (err) {
        console.log(err);
    } else {
        console.log(res);
    }
}

function routeHandler(req, res) {
    func1(req, res, function(err, res) {
        if (res.something === 0) {
            async.waterfall([
                func2,
                func3
            ], mainCallback)
        } else {
            mainCallback(null, 'success')
        }
    })
}

app.get('/create', routeHandler());
请注意,当调用
mainCallback
时,我将第一个值传递为
null
,这样做是为了尊重错误约定,所以当调用mainCallback并且第一个参数有一个值时,我就确定这是一个错误,否则第二个参数应该包含结果

此外,这将使代码更易于阅读和理解,因为在
func1
中有一个
if
分支


我建议也读一下:

不要使用返回/抛出错误来控制执行流,这是一种代码味道

而是按照如下方式重构代码:

function mainCallback(err, res) {
    if (err) {
        console.log(err);
    } else {
        console.log(res);
    }
}

function routeHandler(req, res) {
    func1(req, res, function(err, res) {
        if (res.something === 0) {
            async.waterfall([
                func2,
                func3
            ], mainCallback)
        } else {
            mainCallback(null, 'success')
        }
    })
}

app.get('/create', routeHandler());
请注意,当调用
mainCallback
时,我将第一个值传递为
null
,这样做是为了尊重错误约定,所以当调用mainCallback并且第一个参数有一个值时,我就确定这是一个错误,否则第二个参数应该包含结果

此外,这将使代码更易于阅读和理解,因为在
func1
中有一个
if
分支


我建议您也读一读:

谢谢您的快速回复。我在func1 done({value:1})中这样尝试过;但它显示未定义完成。@itdeeps我使用了
done
作为回调参数名称的示例(通常使用的名称是:
cb
next
done
callback
)。我已经更新了答案。永远不要返回/抛出错误/异常来控制执行流。@edin我很抱歉我的错误。。我认为这是一种预先定义的方法。好的,正如您和nvartolomei提到的,没有办法向主回调添加额外的参数。好的,让我试试。谢谢你最快的回复。我在func1 done({value:1})中这样尝试过;但它显示未定义完成。@itdeeps我使用了
done
作为回调参数名称的示例(通常使用的名称是:
cb
next
done
callback
)。我已经更新了答案。永远不要返回/抛出错误/异常来控制执行流。@edin我很抱歉我的错误。。我认为这是一种预先定义的方法。好的,正如您和nvartolomei提到的,没有办法向主回调添加额外的参数。好的,让我试试……谢谢你的回复。事实上,我已经补充说,如果只是一个例子。实际上,我在每个回调中执行DB调用,并决定做什么。。无论如何,谢谢你的链接。。让我尝试在第二个参数中发送响应数据。谢谢您的响应。事实上,我已经补充说,如果只是一个例子。实际上,我在每个回调中执行DB调用,并决定做什么。。无论如何,谢谢你的链接。。让我尝试在第二个参数中发送响应数据。。