如何在从 Fetch Api 返回的 Promise 对象中获取错误值?

Posted

技术标签:

【中文标题】如何在从 Fetch Api 返回的 Promise 对象中获取错误值?【英文标题】:How can i get errors value inside Promise object which return from Fetch Api? 【发布时间】:2017-03-18 01:40:11 【问题描述】:

我有这样的获取请求。

fetch(deafaultUrl + '/v1/users/',
        
            headers: 
                'Content-Type': 'application/json'
            ,
            method: "POST",
            body: JSON.stringify(userInfoParams)
        )
        .then(function(response) 
            console.log(response);
            console.log(response.json());

            // not working never go into this function
            response.json().then(function(value) 
                console.log('access promise');
                console.log(value); // "Success"
            );

            if (response.status !== 200 && response.status !== 201) 
                throw new Error("Bad response from server");
            
        )
        .then(function(json)

            console.log("succeed json re");
            console.log(json);
            dispatch(update_user(json));

        ) 

所以当我安慰这个console.log(response.json());

我知道了

但似乎 Promise 功能无法锻炼。

那么如何在 [[PromiseValue]] 中获取错误对象?

谢谢!

【问题讨论】:

为什么是双 then 【参考方案1】:

要从 Promise 中获取错误,您可以这样做:

promise.then(function(data) 
  , function(error) ...

要得到 promise 错误,你也可以使用 .catch() 块

 .then()...
 .catch()..

永远不要去这部分,因为服务器已经发送了响应

.then(function(response) 
            console.log(response);
            console.log(response.json());

            // not working never go into this function
            response.json().then(function(value) 
                console.log('access promise');
                console.log(value); // "Success"
            );

你可以这样写你的代码:

fetch(deafaultUrl + '/v1/users/', 
        headers: 
            'Content-Type': 'application/json'
        ,
        method: "POST",
        body: JSON.stringify(userInfoParams)
    )
    .then(function(response) 
        // if request is successful
    
    .catch(err)
         // if got error
     
    );

【讨论】:

【参考方案2】:

我找到了response.json() 只能读取一次的解决方案,如果我得到console.log(response.json()); 它工作正常。

【讨论】:

这是正确的。如果您想多次阅读,则需要克隆响应 (developer.mozilla.org/en-US/docs/Web/API/Response/clone)。顺便说一句,这不是记录它的正确方法。 console.log(response.json()) 会记录 json() 函数返回的 promise,但是你想记录结果,所以 response.json().then(data => console.log(data))。 【参考方案3】:

这里是then(...)的文档

你应该这样使用它:

p.then(function(value) 
   // fulfillment
  , function(reason) 
  // rejection
);

那么你的代码会是这样的

fetch(deafaultUrl + '/v1/users/', 
        headers: 
            'Content-Type': 'application/json'
        ,
        method: "POST",
        body: JSON.stringify(userInfoParams)
    )
    .then(function(response) 
        //Land here if request is successful
        console.log(response);

        if (response.status !== 200 && response.status !== 201) 
            throw new Error("Bad response from server");
        
    , function(error)
        //Land here if request has an error
        console.log(error);
    );

【讨论】:

这不起作用,即使我收到错误422 响应它仍然进入第一个块而不是第二个块。 去检查什么是422 错误。错误在您的电话中

以上是关于如何在从 Fetch Api 返回的 Promise 对象中获取错误值?的主要内容,如果未能解决你的问题,请参考以下文章

在 JavaScript 中使用 fetch() 时,如何将返回对象的详细信息呈现到 html 页面上

Fetch -API 返回 HTML 而不是 JSON

如何在从 Meteor.method 返回之前等待子流程结果

从 WordPress API (wp-json) 取消设置数据

如何将 Fetch API 的值传递给变量? [复制]

Javascript - 如何知道Fetch API中的响应类型?