簡體   English   中英

Javascript Promise解決價值

[英]Javascript Promise resolve value

我正在嘗試從諾言中返回一個值,但是我不能。 為什么不起作用?

我僅收到Promise { <pending> }輸出。

功能

  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()鏈之外訪問它們。

res.render("frontend/index", {
    value1 : value1,
    value2 : value2,
    value3 : value3
  });

編輯#2

我正在使用Express.js

現在,我收到"Error: Can't set headers after they are sent." 錯誤,希望現在可以更清楚了。 當用戶嘗試訪問頁面時,我查詢數據庫並將變量傳遞給視圖,但是每個視圖有多個操作(用戶名,帖子信息,評論等)。

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);
      });
    });
  }

  username().then(function (b) {
    res.render('backend/index', {
      username: b.username
    });
  });

  function post() {
    return new Promise(function (resolve, reject) {
      post.where('id', req.params.postId).fetch().then(function (data) {
        data = data.toJSON();
        resolve(data);
      });
    });
  }

  post().then(function (a) {
    res.render('backend/index', {
      post: a.post
    });
  });

};

.then()函數僅返回一個.then() 在上面的代碼變量中, r只是一個承諾引用對象。

如果您要使用諾言返回的響應,這就是您要執行的操作-

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 thenable函數內部返回值將僅返回promise,而不返回值。

您將需要等待,直到所有的諾言都得到解決,然后才從服務器發送響應。 發送響應后,您將無法再次發送它,因此將出現錯誤headers...

根據修改后的問題更新了答案-

 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的值已分配。

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
});

嘗試執行下一個過程,其中在.then()內部使用rfulfilled值來訪問Promise r異步返回值

var r = username().then(function (a) {
    return a.username;
});

r.then(function(data) {
  // `data` : `r` return value
  // do stuff with `data` here
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM