如何将变量'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});
}
代码工作正常。但是,我想操纵函数的外部。
答案 0 :(得分:1)
将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
呼叫完成后运行。
答案 1 :(得分:0)
将其视为异步。基本上你的渲染在它具有回调内容之前进行渲染。