Javascript 承诺并回应本地援助
我需要帮助理解我的基本想法,但有人能帮我更深入地解释 我看了一下Mozilla上的节点承诺Javascript承诺,但我认为这就是问题所在 如果你真的需要帮助,请不要简单地给我答案,我想知道“为什么” 我有两种方法。“工作页面” 和来自任何其他页面的呼叫“其他页面” 工作页Javascript 承诺并回应本地援助,javascript,react-native,Javascript,React Native,我需要帮助理解我的基本想法,但有人能帮我更深入地解释 我看了一下Mozilla上的节点承诺Javascript承诺,但我认为这就是问题所在 如果你真的需要帮助,请不要简单地给我答案,我想知道“为什么” 我有两种方法。“工作页面” 和来自任何其他页面的呼叫“其他页面” 工作页 var Server_Ip = 'http://0.0.0.0:0000/' let fetching = false; exports.POST = function (url, data) { if (fetch
var Server_Ip = 'http://0.0.0.0:0000/'
let fetching = false;
exports.POST = function (url, data) {
if (fetching) return Promise.reject({D: 5});
fetching = true;
fetch(Server_Ip + url, {
method: 'POST',
headers: {
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify(data),
})
.then(response => Promise.all([response.json()]))
.then(([response]) => {
fetching = false;
return response;
})
.catch(err => {
console.log("error catch search:", err.message);
fetching = false;
// Choose one, depends what you need.
return {D: 0};
return Promise.reject(err);
})
}
然后我从另一个页面打电话
Wkr.POST(string, data_send).then(response => {
console.log('response');
console.log(response);
//9 - SIGN IN PASSWORD MATCHES
if (response.D == 9) {
alert("YAY! GO THRU")
}
//8 - PASSWORDS DONT MATCH
else if (response.D == 8) {
alert("SORRY!, THE PASSWORDS DONT MATCH")
}
//7 - NO SUCH USER
else if (response.D == 7) {
alert("SORRY!, NO SUCH USER")
}
//6 - EMAIL IS NOT VALIDATED
else if (response.D == 6) {
alert("SORRY!, EMAIL IS NOT VALIDATED")
}
//5 - YOU HAVE TRIED TO LOGIN
else if (response.D == 5) {
alert("YOU HAVE TRIED TO LOGIN, PLEASE DONT SPAM")
}
//0 - ERROR
else if (response.D == 0) {
alert("ERROR");
} else {
alert("SHOULD NOT BEEN HERE");
console.log(response);
}
});
所以我故意弄乱了服务器的IP来模拟一个可能的问题,它没有做太多,但当我发垃圾邮件时,它会返回
[16:39:21] Possible Unhandled Promise Rejection (id: 0):
[16:39:21] Object {
[16:39:21] "D": 5,
[16:39:21] }
[16:39:21]
据我所知,这是正在处理的,应该点击if语句“5”原因是您另一页中的
then
回调不处理拒绝,即您使用Promise.reject生成的拒绝。要处理拒绝,您应该在另一个页面中链接一个.catch
回调:
.then(response => { // This is called when the promise was fulfilled
......
}).catch(reason => { // This is called when the promise was rejected
if (reason.D == 5) {
alert("YOU HAVE TRIED TO LOGIN, PLEASE DONT SPAM")
}
.....
});
另一件事:在worker页面中,函数不会返回承诺(拒绝情况除外)。您需要返回fetch
返回的内容:
return fetch(Server_Ip + url, {
^^^^^^^
在worker页面中,您还有一些未完成的代码:
// Choose one, depends what you need.
return {D: 0};
return Promise.reject(err);
。。。你需要选择。你不能两者兼得。您选择哪一个将决定上述处理程序中的哪一个(然后是或catch
处理程序)将结束此案例。还请注意,返回承诺。拒绝(err)
与仅抛出错误
(在然后/catch
回调或承诺构造函数回调的上下文中)没有太大区别 原因是另一页中的then
回调不处理拒绝,即您使用Promise.reject生成的拒绝。要处理拒绝,您应该在另一个页面中链接一个.catch
回调:
.then(response => { // This is called when the promise was fulfilled
......
}).catch(reason => { // This is called when the promise was rejected
if (reason.D == 5) {
alert("YOU HAVE TRIED TO LOGIN, PLEASE DONT SPAM")
}
.....
});
另一件事:在worker页面中,函数不会返回承诺(拒绝情况除外)。您需要返回fetch
返回的内容:
return fetch(Server_Ip + url, {
^^^^^^^
在worker页面中,您还有一些未完成的代码:
// Choose one, depends what you need.
return {D: 0};
return Promise.reject(err);
。。。你需要选择。你不能两者兼得。您选择哪一个将决定上述处理程序中的哪一个(然后是或catch
处理程序)将结束此案例。还请注意,返回承诺。拒绝(err)
与仅抛出错误
(在然后/catch
回调或承诺构造函数回调的上下文中)没有太大区别 谢谢你的回复。我知道大多数人都觉得这是一个愚蠢的问题,但如果我不明白一些事情,我需要知道为什么。那么在任何承诺中,处理拒绝的唯一方法是通过捕获?因为这个方法已经在尝试中了。我问这个问题的原因是因为我看到了一些方法,它们彼此相邻。。也许这就是我感到困惑的原因。try/catch
和.catch
做不同的事情。拒绝的承诺不是异常,但如果您不处理它,引擎将通过生成未处理的拒绝异常来警告您。但是是的,.catch
用于在承诺被拒绝时执行某些操作.then
(第一个参数)用于在履行承诺时执行某些操作。解析
和拒绝
函数仅在必须从头开始创建承诺时起作用。这不是你的情况,因为你已经得到了一个fetch
。谢谢你的回复。我知道大多数人都觉得这是一个愚蠢的问题,但如果我不明白一些事情,我需要知道为什么。那么在任何承诺中,处理拒绝的唯一方法是通过捕获?因为这个方法已经在尝试中了。我问这个问题的原因是因为我看到了一些方法,它们彼此相邻。。也许这就是我感到困惑的原因。try/catch
和.catch
做不同的事情。拒绝的承诺不是异常,但如果您不处理它,引擎将通过生成未处理的拒绝异常来警告您。但是是的,.catch
用于在承诺被拒绝时执行某些操作.then
(第一个参数)用于在履行承诺时执行某些操作。解析
和拒绝
函数仅在必须从头开始创建承诺时起作用。这不是您的情况,因为您已经通过fetch
获得了一个。