如何将信息放入变量'data'到新变量'newData'中?

var accountSid = '12345';
var authToken = "12345";
var client = require('twilio')(accountSid, authToken);

app.get("/results", function(req,res){
   var query = req.query.search
   var newData;

   // Retrieve list of messages
   client.messages.list(query, function(err, data) {
       if(err){console.log(err)}
       else {
         // Pass info into 'newData'
         newData = data;
       }
   });

console.log(newData);

res.render("results", {data: newData});
});


上面的代码导致未定义'newData'。

如果这样做:

        else {
         // Render raw 'data'
         res.render("results", {data: data});
       }


该代码工作正常。但是,我想在函数外部操作数据。

最佳答案

将对newData的使用移到定义它的回调中:

app.get("/results", function (req,res){
  var query = req.query.search
  var newData;

  // Retrieve list of messages
  client.messages.list(query, function (err, data) {
    if (err) { console.log(err); }
    else {
      newData = data;
      res.render("results", { data: newData });
    }
  });
});


问题是newData在回调运行之前不会被填充,但是您正在尝试使用该值。

这是您的原始代码,带有注释的注释说明了按什么顺序发生的情况:

app.get("/results", function (req,res){
  // 1. This code runs first.
  var query = req.query.search
  var newData;

  // 2. This call is made second.
  client.messages.list(query, function (err, data) {
    // 5. This code runs fifth, after the list call has completed.
    if (err) { console.log(err); }
    else {
      // Pass info into 'newData'
      newData = data;
    }
  });

  // 3. This console.log is third.
  console.log(newData);

  // 4. This runs fourth, at which point the HTTP response has been sent.
  res.render("results", { data: newData });
});


希望这样可以弄清楚为什么res.render调用属于回调函数。您希望它在list调用完成后运行。

关于javascript - 如何操纵Twilio数据对象? Node JS,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46291086/

10-09 20:06