[英]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()
內部使用r
已fulfilled
值來訪問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.