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吗?