具有嵌套回调函数的函数不返回值

时间:2014-05-27 17:33:05

标签: javascript node.js callback

我有一个函数,其中有一个嵌套的回调函数结构。我想要第一个"母亲"函数返回某个值后,在回调函数序列中计算出来。然而。它并没有真正起作用。这是代码的简化版本,您认为可以提供帮助吗?

console.log(finalResult());

function finalResult() {    

var finalanswer = firstFunction(secondFunction);

function firstFunction (callback) {
    var notion = 1;
    callback(null, notion);
}

function secondFunction (err, notion) {
    if (err) console.log(err);
    var answer = notion + 1
    return answer;
}

return finalanswer;  

}  

谢谢!

**更新 - 原始代码**

 return getContexts(makeQuery);


 function getContexts (callback) {

    dbneo.cypherQuery(context_query, function(err, cypherAnswer){

        if(err) {
            err.type = 'neo4j';
            return callback(err);
        }
        // No error? Pass the contexts to makeQuery function
        return callback(null,cypherAnswer);



    });




}

function makeQuery (err,answer) {
    // Error? Display it.
    if (err) console.log(err);

    // Define where we store the new contexts
    var newcontexts = [];

    // This is an array to check if there are any contexts that were not in DB
    var check = [];

    // Go through all the contexts we received from DB and create the newcontexts variable from them
    for (var i=0;i<answer.data.length;i++) {
        newcontexts.push({
            uid: answer.data[i].uid,
            name: answer.data[i].name
        });
        check.push(answer.data[i].name);
    }

    // Now let's check if there are any contexts that were not in the DB, we add them with a unique ID
    contexts.forEach(function(element){
        if (check.indexOf(element) < 0) {
            newcontexts.push({
                uid: uuid.v1(),
                name: element
            });
        }
    });

    return newcontexts;

}

1 个答案:

答案 0 :(得分:0)

您设置finalanswer等于firstFunction的回报但是,如果您查看firstFunction的正文,则不会返回任何内容。 firstFunction的最后一行应为:

return callback(null, notion);

我在Chrome控制台中快速测试了它,它似乎按预期工作,并将2记录到控制台。

<强>更新

既然原始代码已经发布了,我会更新代码:

// call getContexts with a callback when complete
getContexts(function(err, contexts){
    console.log(err);
    console.log(contexts);
});

function getContexts (callback) {
    dbneo.cypherQuery(context_query, function(err, cypherAnswer){
        if(err) {
            err.type = 'neo4j';
            return callback(err);
        }
        // No error? Pass the contexts to makeQuery function
        var contexts = makeQuery(null,cypherAnswer);

        // we have our answer, call the callback
        callback(null, contexts);
    });
}

function makeQuery (err,answer) {
    // Error? Display it.
    if (err) console.log(err);

    // Define where we store the new contexts
    var newcontexts = [];

    // This is an array to check if there are any contexts that were not in DB
    var check = [];

    // Go through all the contexts we received from DB and create the newcontexts variable from them
    for (var i=0;i<answer.data.length;i++) {
        newcontexts.push({
            uid: answer.data[i].uid,
            name: answer.data[i].name
        });
        check.push(answer.data[i].name);
    }

    // Now let's check if there are any contexts that were not in the DB, we add them with a unique ID
    contexts.forEach(function(element){
        if (check.indexOf(element) < 0) {
            newcontexts.push({
                uid: uuid.v1(),
                name: element
            });
        }
    });

    return newcontexts;
}