为什么fetch返回一个奇怪的整数哈希?

时间:2015-12-31 01:19:54

标签: javascript react-native fetch-api

我正在使用fetch API和React Native。

如果状态为> = 400,我的回复遵循{"message": "error here"}的正常格式,我将在原生弹出窗口中显示。

我正在尝试在检测到失败后调用response.json(),但它仍然以一种奇怪的格式放置所有内容......

{ _45: 0, _81: 0, _65: null, _54: null }

无论出于何种原因...我想要的实际响应位于_65 ...我不知道这些随机密钥是什么。

所以目前我不得不通过_bodyText访问它,但我认为这是错误的,因为它是一个私有的下划线方法。

我做错了什么?

var API = (function() {

  var base = 'https://example.com/api/v1';

  var defaults = {
    credentials: 'same-origin',
    headers: {
      'Accept': 'application/json',
      'Content-Type': 'application/json'
    }
  };

  var alertFailure = function(response) {
    if (response.status >= 200 && response.status < 400) {
      return response;
    } else {
      var json = JSON.parse(response._bodyText || '{}');
      var message = json.message || 'There was a problem. Close the app, and try again later.';

      var error = new Error(message);
      error.response = response;
      throw error;
    }
  };

  var callAPI = function(url, opts) {
    opts.headers['X-Version'] = 'v' + Package.version;

    return fetch(base + url, opts)
      .then(alertFailure)
      .then((response) => {
        return response.json();
      })
      .catch((error) => {
        Alert.alert(null, error.message);
      });
  };

  return {

    get: function(url, opts) {
      var fullOpts = Object.assign({}, defaults, opts);
      return callAPI(url, fullOpts);
    },

    post: function(url, data, opts) {
      var fullOpts = Object.assign({}, defaults, {
        method: 'POST',
        body: JSON.stringify(data || {})
      }, opts);
      return callAPI(url, fullOpts);
    }
  };

})();

3 个答案:

答案 0 :(得分:8)

答案是.json()会返回一个承诺......所以我必须在.then()内完成所有工作

答案 1 :(得分:1)

AsyncStorage.getItems始终返回一个promise。您可以使用以下方法

 AsyncStorage.getItem("access_key").then((value)=>
               {
                    console.log(value);
               });

答案 2 :(得分:1)

我建议您使用新的ES7语法async/await,它们比使用.then()更容易理解

要使用它,只需使用异步前缀声明一些方法,并在其中使用await等待调用完成。

E.g

async someMethod(){
    result =  await fetch(URL); // Do some request to any API.
    // Use the result after that knowing that you'll have it completed. 
}

我希望这有帮助,至少在我看来,我发现这比使用.then()更容易,特别是当你必须在同一个方法中进行多次调用时。