Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在nodejs/expressjs中运行多个函数_Javascript_Node.js_Express - Fatal编程技术网

Javascript 在nodejs/expressjs中运行多个函数

Javascript 在nodejs/expressjs中运行多个函数,javascript,node.js,express,Javascript,Node.js,Express,如何在nodejs/expressjs中运行多个函数?在php中,一个接一个地调用函数是很简单的,但是节点中的回调业务很混乱,我经常会遇到一些错误,比如没有定义变量等等。这是我正在做的基本想法 var express = require('express'); var request = require('request'); var app = express(); app.get('/user/:id', function(req, res) { var id = req.para

如何在nodejs/expressjs中运行多个函数?在php中,一个接一个地调用函数是很简单的,但是节点中的回调业务很混乱,我经常会遇到一些错误,比如没有定义变量等等。这是我正在做的基本想法

var express = require('express');
var request = require('request');

var app = express();

app.get('/user/:id', function(req, res) {
   var id = req.params.id;

   getInformation(id, function(info) {
      res.send(info);
   });
});

app.listen(3000);

getInformation(id, callback) {
   var qty = makeExternalApiCall();
   var color = secondFunction(id);
   callback({quantity: qty, color: color});
}

makeExternalApiCall() {
   request({uri: 'https://provider.com/api/stuff/'}, function(error, response, body) {
      if (!error && response.statusCode == 200) {
         return body.qty;
      }
   }
}

secondFunction(id) {
   //look up color by id
   var color = "blue";
   return color;
}

运行多个函数与PHP类似,除非它涉及异步函数。异步回调是一个可以随时调用的函数,它不会与
return
关键字一起使用。以这个回调为例:

var cb = function(arg) {
  console.log(arg);
};
我们可以将此回调函数传递到另一个函数中,并从以下函数中调用该函数:
cb()

function call(text, callback) {
  callback(text);
};

var txt = 'a string';
call(txt, cb);
console.log('breakpoint');
上面的例子是同步运行的。因此,执行顺序为:

call() -> cb()
console.log()
但如果我们延迟函数或添加计时器(
process.nextTick
等待函数的调用堆栈为空,然后执行已排队的内容):

然后再次运行它,我们得到一个不同的执行顺序,因为
cb()
在调用堆栈为空之后排队运行(就在
console.log()
运行之后,它为空):

大多数未定义的变量错误是由于在设置变量之前访问该变量引起的。例如,以异步函数
foo()
为例

回调
函数(bar){…}
可能是在
console.log()
之后调用的,这意味着
console.log()
data
给定值之前运行


至于您的具体问题,请求模块是异步的,并且使用回调,因此您不能在HTTP请求中使用返回值。要从回调函数中获取结果值,需要将其传递给另一个回调函数。使用
return
关键字只会停止函数的执行。因此,改变这一点:

var options = {
  uri: 'https://provider.com/api/stuff/'
};

function makeExternalApiCall() {
  request(options, function(err, res, body) {
    if (!err && res.statusCode == 200) {
       return body.qty;
    }
  }
};
要使用回调,请执行以下操作:

function makeExternalApiCall(callback) {
  request(options, function(err, res, body) {
    if (!err && res.statusCode == 200) {
       callback(null, body.qty);
    }
  }
};
然后,该函数将按如下方式使用:

makeExternalApiCall(function(err, qty) {
  // here is qty
});
因此,使用嵌套回调时,路由代码可能如下所示:

function getInformation(id, callback) {
  var color = secondFunction(id);
  makeExternalApiCall(function(err, qty) {
    callback({ quantity: qty, color: color });
  });
};

app.get('/user/:id', function(req, res) {
   var id = req.params.id;

   getInformation(id, function(info) {
      res.send(info);
   });
});

运行多个函数与PHP类似,除非它涉及异步函数。异步回调是一个可以随时调用的函数,它不会与
return
关键字一起使用。以这个回调为例:

var cb = function(arg) {
  console.log(arg);
};
我们可以将此回调函数传递到另一个函数中,并从以下函数中调用该函数:
cb()

function call(text, callback) {
  callback(text);
};

var txt = 'a string';
call(txt, cb);
console.log('breakpoint');
上面的例子是同步运行的。因此,执行顺序为:

call() -> cb()
console.log()
但如果我们延迟函数或添加计时器(
process.nextTick
等待函数的调用堆栈为空,然后执行已排队的内容):

然后再次运行它,我们得到一个不同的执行顺序,因为
cb()
在调用堆栈为空之后排队运行(就在
console.log()
运行之后,它为空):

大多数未定义的变量错误是由于在设置变量之前访问该变量引起的。例如,以异步函数
foo()
为例

回调
函数(bar){…}
可能是在
console.log()
之后调用的,这意味着
console.log()
data
给定值之前运行


至于您的具体问题,请求模块是异步的,并且使用回调,因此您不能在HTTP请求中使用返回值。要从回调函数中获取结果值,需要将其传递给另一个回调函数。使用
return
关键字只会停止函数的执行。因此,改变这一点:

var options = {
  uri: 'https://provider.com/api/stuff/'
};

function makeExternalApiCall() {
  request(options, function(err, res, body) {
    if (!err && res.statusCode == 200) {
       return body.qty;
    }
  }
};
要使用回调,请执行以下操作:

function makeExternalApiCall(callback) {
  request(options, function(err, res, body) {
    if (!err && res.statusCode == 200) {
       callback(null, body.qty);
    }
  }
};
然后,该函数将按如下方式使用:

makeExternalApiCall(function(err, qty) {
  // here is qty
});
因此,使用嵌套回调时,路由代码可能如下所示:

function getInformation(id, callback) {
  var color = secondFunction(id);
  makeExternalApiCall(function(err, qty) {
    callback({ quantity: qty, color: color });
  });
};

app.get('/user/:id', function(req, res) {
   var id = req.params.id;

   getInformation(id, function(info) {
      res.send(info);
   });
});
您还可以使用next()函数,这使您可以在路由文件内或路由文件之间实现模块化

即使您也不必担心异步和同步环境

在回调中执行next(),它将仅在完成回调或执行回调时满足条件后执行

您还可以使用next()函数,这使您可以在路由文件内或路由文件之间实现模块化

即使您也不必担心异步和同步环境

在回调中执行next(),它将仅在完成回调或执行回调时满足条件后执行


看看javascript承诺——youtube上有几个关于它的好研讨会——看看javascript承诺——youtube上有几个关于它的好研讨会