如何在javascript中使用作用域

时间:2014-05-14 15:38:30

标签: javascript node.js

我对javascript和使用nodejs相对较新。我有一个情况,如果减少woulf归结为下面的代码。我可以直接在回调函数中返回,而不像我在下面的代码中那样创建另一个变量(temp)。

exports.run = function(req, res) {

    var testRunId = req.body.testRunId;
    var testFileDir = './uploads/temptestfiles/'+ testRunId + '/';

    var error = null
    var status ;

    mkpath(testFileDir, function (err) {

        if (!err) {
            error = {error:'could not create logs directory'}
            status = 500
        };

    });

    if (status === 500) {
        return res.send(500, error);
    }

//handle many more cases

}

以下是愚蠢的版本。

var a = function(param,callback) {
    callback(param);
};

var base = function() {
    val temp = null;        
    a(5, function(a){
        //can I do something like return 2*a and end the parent function
        temp = 2*a;
    });

    return temp;
}

我意识到我实际上需要使用mkpath的同步版本,因为我不希望在创建dir之前运行更多代码。所以我的代码改为

try {
    mkpath.sync(testFileDir);
} catch(err) {
    return res.status(500).send({error:'couldn\'t create directory to store log files'});
}

1 个答案:

答案 0 :(得分:1)

你愚蠢的问题(这是同步的)。当然可以,但你必须从你的回调,你的回调处理程序和你的调用函数返回值。

var a = function (param, callback) {
  return callback(param);
};

var base = function () {
  return a(5, function (a) {
      return 2*a;
    });
}

这在异步情况下不起作用,然后您需要回调函数,或者返回延迟,承诺或未来。

例如

function asynchDoubler(number) {
  var deferred = new Deferred();
  setTimeout(function () {
      deferred.callback(2*number);
    }, 1);
  return deferred;
}

asynchDoubler(5).addCallback(function (result) { 
    console.log(result); 
  });
// outputs 10