gpt4 book ai didi

javascript - 我的返回值函数失败了——我认为与 Promise 相关

转载 作者:行者123 更新时间:2023-11-29 10:56:05 25 4
gpt4 key购买 nike

问题我正在开发一个简单的登录页面。在我的 View 模型脚本中,我调用另一个脚本来处理对我的 API 的调用。

简而言之,我没有取回我想要的预期数据,这只是一个 token 字符串(表示登录成功)。

这是我正在使用的模拟 Json

[
{
"id":1,
"firstName":"John",
"lastName":"Smith",
"email":"john@gmail.com",
"token" : "65456j4h56j4h6gjk4g6k7g6k5g7jh567"
}
]

我的 View 模型脚本

import {user} from "../shared/user-service.js";
import {token} from "../shared/token-service.js";


// Login View Model
var LoginViewModel = function () {

self = this;

this.token = ko.observable();
this.email = ko.observable("john@gmail.com");
this.password = ko.observable("12345");

self.submit = function () {
var oUser = {
email: self.email(),
password: self.password()
};

// I am not getting back desired results here
var loginResponse = user.login(oUser);
alert(loginResponse.token);


}

}; // End View Model


ko.applyBindings(new LoginViewModel());

最后,这是我的用户服务文件:

let user = {

getUserSession: function () {
var user = JSON.parse(sessionStorage.getItem('user'));
console.log(`Getting User from Session: value = ${user} `);
return user;
},

setUserSession: function (objUser) {
var user = JSON.stringify(objUser);
sessionStorage.setItem("user", user);
console.log(`Setting User in Session: value = ${user} `);
},



login: function (objUser) {

return fetch('../api/user/login.json', {
method: "GET",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
})
.then((response) => response.json())
.then((responseData) => {
console.log(responseData);
return responseData;
})
.catch(error => console.warn(error));
}




};

/* Helper Functions */
function handleErrors(response) {
if (!response.ok) {
console.log(JSON.stringify(response));
throw Error(response.statusText);
}
return response;
}

export {
user
};

Console.Log 数据截图 Login Screenshot

这是我的 login-view-model.js 中警报的值...

未定义的结果 Undefined

本质上,我只想登录用户。如果有效,获取 API 返回的 token ,并将其保存到 session 中。如果未返回 token ,只需发出警报。

我不知道为什么这对我来说如此困难。我真的很感激关于这方面的一些指导。

哦,当然,你看我只是用这个模拟数据进行测试。一旦我获得此功能,我会将其转换为 POST 和真实 URL。

感谢您阅读本文。

约翰

最佳答案

问题1

您的 JSON 数据未正确读取。

快速解决方案

您的响应是对象的数组。在访问其属性之前,您首先需要在其中找到正确的对象。如果它总是相同的(第一个),对 [0] 的简单访问将起作用:

// I am not getting back desired results here
var loginResponse = user.login(oUser);
alert(loginResponse[0].token); // <-- Add [0]

否则,您将不得不使用循环对其进行迭代。

更好的解决方案

如果您知道您总是只能得到一个零个对象(取决于它是否成功),您可以简单地返回对象 在服务器代码中并且不是一个对象的数组

问题2

您没有正确处理您的 Promise。你不能从 then block 中返回。您应该返回一个 Promise 或使函数异步。检查片段:

login: function (objUser) {
return new Promise((resolve, reject) => { // <-- return a promise and not the fetch method
fetch('../api/user/login.json', {
method: "GET",
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json',
},
})
.then((response) => response.json())
.then((responseData) => {
console.log(responseData);
resolve(responseData); // <-- "return" the data
})
.catch(error => {
console.warn(error);
reject(error); // <-- reject if failed
});
})
}

你需要相应地改变另一部分:

// I am not getting back desired results here
user.login(oUser).then(response => {
alert(response[0].token);
});

关于javascript - 我的返回值函数失败了——我认为与 Promise 相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56967392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com