Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺并回应本地援助_Javascript_React Native - Fatal编程技术网

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

我需要帮助理解我的基本想法,但有人能帮我更深入地解释

我看了一下Mozilla上的节点承诺Javascript承诺,但我认为这就是问题所在

如果你真的需要帮助,请不要简单地给我答案,我想知道“为什么”

我有两种方法。“工作页面”

和来自任何其他页面的呼叫“其他页面”

工作页

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
获得了一个。