node.js

时间:2015-11-15 19:36:13

标签: javascript node.js callback asynccallback

我有以下代码:

 exported.removeAllWatchesForUser = function (projectKey, userObj, done) {
   console.log('done='+done); // Function is recognized

    // Get list of all issues & remove the user from watchers list   
    exported.getIssueList(projectKey, function(err, response, done){
                console.log('done='+done); // callback is not recognize but is 'undefined

    });
};

我的问题是回调函数'done'在第2行中被识别,但它在getIssueList回调中的第6行中是'undefined'。

如何在此功能中使其可用,以便我可以将呼叫传递回连续的异步方法?

2 个答案:

答案 0 :(得分:1)

从参数列表中删除done

function(err, response, done) ->  function(err, response)

否则参数会使用与外部函数相同的名称隐藏参数。

答案 1 :(得分:1)

您已在第二个回调中重新定义了一个单独的done,它将“隐藏”更高范围的done的值。如果您要么在第二个回调中删除done参数,或者将其命名为不同的参数,那么您可以直接访问更高范围的done.

这是您的代码,第二个回调重命名为issueDone

exported.removeAllWatchesForUser = function (projectKey, userObj, done) {
   console.log(typeof done); // Function is recognized

    // Get list of all issues & remove the user from watchers list   
    exported.getIssueList(projectKey, function(err, response, issueDone){
          // you can directly call done() here
    });
};

或者,如果您不打算使用issueDone,那么您可以将其从回调声明中删除。就个人而言,如果实际通过,我宁愿给它一个不同的名称来承认它存在且可用,但你可以使用这两个选项中的任何一个:

exported.removeAllWatchesForUser = function (projectKey, userObj, done) {
   console.log(typeof done); // Function is recognized

    // Get list of all issues & remove the user from watchers list   
    exported.getIssueList(projectKey, function(err, response){
          // you can directly call done() here
    });
};

当使用您正在使用的内联回调时,Javascript允许您访问父作用域中的所有变量,只要您不在当前作用域中重新定义与较高作用域中的新变量同名的新变量。当您重新定义变量(作为局部变量,函数或命名函数参数)时,它会“隐藏”更高范围内的值,从根本上覆盖它,以便您无法达到更高的范围。

因此,在更高级别范围内访问变量的解决方案是确保您不在当前范围内定义具有相同名称的变量。