1

我只是 JavaScript 的初学者,我想在执行下一个动作之前等待一个动作的结束。我已经在 Google 上搜索了我的问题的答案,但我发现的只是使用回调将函数串在一起。好的,但这不是我需要的。我不想做链子,我想做一个叠合,像这样:

function f1() {
    function f2() {
        function f3() {
            return result;
        }
    return result;
    }
return result;
}

因此,当我调用 console.log(f1) 时,它会打印在 f3() 中计算的结果。有没有一种简单的方法可以做到这一点?

谢谢你。

萨拉。

编辑:好吧,我想我必须举一个更好的例子!具体来说,我在一个带有 express 的 Web 服务器和一个带有 mongoose 和 mongodb 的数据库上工作。我有四种类型的路径:关于工作、组、工作人员和用户的路径。当我获得一个页面时,我必须获得要显示的数据库中正确的元素列表:如果我进入页面 /job,我会得到现有工作的列表,如果我进入页面 /user,我会得到现有用户列表等。在路由文件中,我调用另一个文件来管理与数据库的连接。这是我的代码:

在文件 route.js 中:

var mongo = require('./mongo');
exports.list = function(req, res) {
    var data = mongo.read(req.params.type);//the type of element we are looking for (jobs, user...)
    res.render('liste', {
        table: data; //In the view, we get table.name, table.status, for each element of the table
    }
}

在我的 mongo.js 中:

exports.read = function(type) {
    var result;
    start(); //It's the function which start the database, create the schemas, etc...
    if(type == 'job')//4 conditions, in which we get the right model (in the var model) according to the page we're looking for
    model.find(function(err, data) {
        if(err) { ... }
        else {
            result = data;
        }
     }

     return result; //It return nothing, because it do this before doing the model.find(...)
}

我希望它更清楚。

编辑(再次...):谢谢大家的回答,也谢谢 Sagi Isha 给我的解决方案 :)

4

5 回答 5

3

根据您的节点/快递代码:节点异步工作,这意味着您需要将回调传递给 I/O 操作,

IE

var mongo = require('./mongo');
exports.list = function(req, res) {
  mongo.read(req.params.type, function(err, data){
    if (err) {return console.error(err)}
    res.render('liste', {table: data});
  });
}

exports.read = function(type, callback) {
  if(type == 'job') {
    model.find(callback);
  }
}
于 2013-05-23T08:20:11.513 回答
1

在您的示例中,您永远不会调用函数 f2 和 f3

function f1() {
  function f2() {
      function f3() {
         return result;
      }
    return f3();
   }
 return f2();
}
于 2013-05-23T08:22:05.657 回答
0

您正在寻找立即函数调用

检查此代码

function f1(){
 return 
   (function(){
      return 
        (function(){ return 1})()
   })()
};

console.log(f1());// prints 1

检查此链接以获取更多信息

于 2013-05-23T08:23:59.943 回答
0

我们真的需要知道每个函数中正在做什么,但是假设您正在处理下一个函数中每个函数的返回值,您可以这样做:

function f1(){
   var inputValue = 1;
   var result = f2(inputValue);
   result = f3(result);
   return result;
}

function f2(input){

  <!-- Do some processing -->
  return result;

}

function f3(input){

 <!-- Do some processing -->
 return result; 

}
于 2013-05-23T08:24:02.263 回答
0

听起来您正在使用异步代码-函数return在将结果生成给回调函数之前会执行:

function async(callback) {
    // start heavy processing
    return undefined;
    // when processing is finished,
    // callback(result);
}

例如setTimeout,ajax、用户事件等。

如果您的代码中有这样的行为,则需要将嵌套的f2/f3作为回调传递给它们:

function f1(callback) {
    someAsync1(function f2(resultfromAsync1) {
        someAsync2(function f3(resultfromAsync2) {
            someAsync3(callback);
        });
    });
});

要调用它并记录结果,您将使用

f1(function(resultfromAsync3) {
    console.log(resultfromAsync3);
});
于 2013-05-23T08:39:47.253 回答