Javascript承诺解析值
我试图从一个承诺中返回一个值,但我不能。为什么它不起作用 我只得到Javascript承诺解析值,javascript,Javascript,我试图从一个承诺中返回一个值,但我不能。为什么它不起作用 我只得到Promise{}输出 作用 function username() { return new Promise(function (resolve, reject) { user.where('id', req.id).fetch().then(function (data) { data = data.toJSON(); resolve(data); });
Promise{}
输出
作用
function username() {
return new Promise(function (resolve, reject) {
user.where('id', req.id).fetch().then(function (data) {
data = data.toJSON();
resolve(data);
});
});
}
变数
var r = username().then(function (a) {
return a.username;
});
console.log(r);
如果我删除return
并放置console.log(a.username)
,它会工作,但这不是我想要的结果。我想将返回值放入r
中
编辑#1
我需要将返回的值传递到视图中(如下所示),因此我必须能够在then()链之外访问它们
编辑#2
我正在使用Express.js
现在我得到了“错误:发送邮件后无法设置邮件头。”
错误,我希望现在更清楚。当用户试图访问页面时,我会查询数据库并将变量传递给视图,但每个视图都有多个操作(用户名、帖子信息、注释等)
.then()
函数只返回一个承诺。在上面的代码中,变量r
只不过是一个promise引用对象
如果您希望使用从承诺返回的响应,您将这样做-
username().then(function (a) {
console.log(JSON.stringify(a));
// you will need to use the response returned from server here..
// display in view or something else
res.render("frontend/index", {
value1 : a.value1,
value2 : a.value2,
value3 : a.value3
});
});
从promise内部返回值Table函数将只返回promise,而不返回值
您需要等待所有承诺都得到解决,然后只从服务器发送响应。一旦发送了响应,就不能再次发送,因此会出现错误标题…
根据修改后的问题更新答案-
exports.index = function (req, res) {
function username() {
return new Promise(function (resolve, reject) {
user.where('id', req.id).fetch().then(function (data) {
data = data.toJSON();
resolve(data);
});
});
}
function post() {
return new Promise(function (resolve, reject) {
post.where('id', req.params.postId).fetch().then(function (data) {
data = data.toJSON();
resolve(data);
});
});
}
username().then(function (b) {
post().then(function (a) {
res.render('backend/index', {
post: a.post,
username: b.username
});
});
});
};
.then()
函数只返回一个承诺。在上面的代码中,变量r
只不过是一个promise引用对象
如果您希望使用从承诺返回的响应,您将这样做-
username().then(function (a) {
console.log(JSON.stringify(a));
// you will need to use the response returned from server here..
// display in view or something else
res.render("frontend/index", {
value1 : a.value1,
value2 : a.value2,
value3 : a.value3
});
});
从promise内部返回值Table函数将只返回promise,而不返回值
您需要等待所有承诺都得到解决,然后只从服务器发送响应。一旦发送了响应,就不能再次发送,因此会出现错误标题…
根据修改后的问题更新答案-
exports.index = function (req, res) {
function username() {
return new Promise(function (resolve, reject) {
user.where('id', req.id).fetch().then(function (data) {
data = data.toJSON();
resolve(data);
});
});
}
function post() {
return new Promise(function (resolve, reject) {
post.where('id', req.params.postId).fetch().then(function (data) {
data = data.toJSON();
resolve(data);
});
});
}
username().then(function (b) {
post().then(function (a) {
res.render('backend/index', {
post: a.post,
username: b.username
});
});
});
};
您必须将该值的使用限制为传递给
的函数。然后
。没有其他逻辑方法可以断言r
的值已分配
var r;
username().then(function(a) {
r = a.username;
// use r here
// resolve promise with value of username
return r;
}).then(function(username) {
// or use it here
});
您必须将该值的使用限制为传递给
的函数。然后
。没有其他逻辑方法可以断言r
的值已分配
var r;
username().then(function(a) {
r = a.username;
// use r here
// resolve promise with value of username
return r;
}).then(function(username) {
// or use it here
});
尝试执行下一个过程,其中
r
的值在中使用。然后()
从Promise
r
访问异步返回值
var r = username().then(function (a) {
return a.username;
});
r.then(function(data) {
// `data` : `r` return value
// do stuff with `data` here
});
尝试执行下一个过程,其中r
的值在中使用。然后()
从Promise
r
访问异步返回值
var r = username().then(function (a) {
return a.username;
});
r.then(function(data) {
// `data` : `r` return value
// do stuff with `data` here
});
AFAK then()重新运行一个承诺,因此r是一个承诺,而不是它的结果。“要将返回值放在r内部吗”对于r
,下一个过程是什么?您无法访问.then链外部的值。“因此我必须能够访问then()链外部的值。”为什么res.render
不能在then()内调用重新运行一个承诺,因此r是一个承诺,而不是它的结果。“要将返回值放在r中吗”对于r
,下一个进程是什么?您无法访问.then链之外的值。“因此,我必须能够在then()链之外访问它们。”为什么res.render
不能在.then()内调用
第一次变量r
将以未定义的形式记录。是的,console.log
将在函数解析之前被调用,唯一的强制方法是将其放入另一个then()
调用中。第一次变量r
将以未定义的形式记录。是,在函数解析之前将调用console.log
,强制它的唯一方法是将其放入另一个then()调用中。您也可以在then函数中调用res.render(…)
。基本上应该是这样的。如果您想对返回的响应执行任何操作,应该在内部调用它。然后(function(){//here})
仅限…谢谢,但是如果我处理多个函数(用户名、帖子、类别等)来提供视图,该怎么办?我需要为每个函数使用res.render吗?如果不同的函数涉及或依赖于不同的承诺,那么是的。谢谢你的帮助,我不知道是否应该问一个新问题,所以现在开始。请将edit#2签出好吗?您也可以在then函数中调用res.render(…)
。基本上应该是这样的。如果您想对返回的响应执行任何操作,应该在内部调用它。然后(function(){//here})
仅限…谢谢,但是如果我处理多个函数(用户名、帖子、类别等)来提供视图,该怎么办?我需要为每个函数使用res.render吗?如果不同的函数涉及或依赖于不同的承诺,那么是的。谢谢你的帮助,我不知道是否应该问一个新问题,所以现在开始。你能签出编辑2吗?