无法从节点模块中的异步瀑布获取返回值

125*_*748 1 javascript asynchronous node.js promise express

我有一个节点模块,它使用异步瀑布执行一些操作。它独立工作,并在通过 AJAX 调用运行时完成所有任务,但是,我的 AJAX 回调从未获得其返回值。

//node module 

var boilerplateFn = function(params){
    async.waterfall([
        function(callback){
            //do task 1
            callback(null, results);
        },
        function(results, callback){
            //task 2 is write
            fs.writeFile(path, results, function(err){
                if (err){
                    console.log(err);
                }else{
                    callback(null, results)
                }
            })
        }
    ], function(err, results){
        return results
    });
}

module.exports = exports = boilerplateFn;
Run Code Online (Sandbox Code Playgroud)

这将正确写入文件,如果我在最终函数中执行 console.log,我可以看到我的结果字符串。

但是,当我尝试将它包含在这样的路线中时:

var components = require('./app/js/node_components');
app.get('/process/:scale/:type', function(req, res){
    var data = processRequest(req.params);
    res.json(data);
});

function processRequest(params){
    console.log(componentents.boilerplateFn(params)) //prints undefined in Terminal
    return {
        result: componentents.boilerplateFn(params);
    }
}
Run Code Online (Sandbox Code Playgroud)

我通过 jQuery AJAX 请求调用路由,文件写得很好,但是,我没有像我期望的那样在控制台中看到返回的数据:

return $.ajax({
        type: 'get',
        url: 'http://localhost:8888/' + paramStr,
        dataType: 'json'
    }).done(function(data){
        console.log('returned data', data) //returned data Object{}
    }).fail(function(jqObj, textStatus, err){
        console.log(jqObj, textStatus, err);
    })
});
Run Code Online (Sandbox Code Playgroud)

我认为这意味着我的文件正在写入但我的函数已经返回所以它永远不会得到返回的文本。但是,我尝试包装res.json回调,但它没有改变任何东西。

    processRequest(req.params, function(data){
      res.json(data);
    });


function processRequest(params, callback){
    var data = componentents.boilerplateFn(params);
    callback(data);
}
Run Code Online (Sandbox Code Playgroud)

并不感到惊讶它不起作用,只是一个想法。如何将返回值返回给调用模块的函数?还是我只是做了一些根本不正确的事情?

msc*_*dex 5

你不能把异步的东西当作同步的东西来对待。相反,传入一个回调:

var boilerplateFn = function(params, cb) {
  async.waterfall([
    function(callback) {
      // do task 1
      callback(null, results);
    },
    function(results, callback) {
      // task 2 is write
      fs.writeFile(path, results, function(err) {
        if (err) {
          callback(err);
        } else {
          callback(null, results);
        }
      })
    }
  ], cb);
}

module.exports = boilerplateFn;
Run Code Online (Sandbox Code Playgroud)

然后像这样使用它:

var components = require('./app/js/node_components');
app.get('/process/:scale/:type', function(req, res) {
  processRequest(req.params, function(err, data) {
    // TODO: check `err` first
    res.json({ result: data });
  });
});

function processRequest(params, cb) {
  components.boilerplateFn(params, cb);
}
Run Code Online (Sandbox Code Playgroud)