2015-12-31 2 views
5

Я использую API fetch с React Native.Почему выборка возвращает странный хэш целых чисел?

Мой ответ соответствует нормальному формату {"message": "error here"}, если статус> = 400, который я покажу в собственном всплывающем окне.

Я пытаюсь вызвать 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); 
    } 
    }; 

})(); 

ответ

8

Ответ таков, что .json() возвращает обещание ... так что я должен был сделать все, что от в пределах .then()

+0

Это тоже то же самое для 'asyncstorage' – James111

+0

Просто столкнулась с такой же проблемой с' async' и 'await'. Все еще пытаюсь разрешить это. – Dan

+0

Я добавил свою проблему здесь http://stackoverflow.com/questions/36285564/why-does-fetch-return-a-weird-hash-of-integers-part-2 – Dan

1

AsyncStorage.getItems всегда возвращает обещание. Вы можете использовать этот метод ниже

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

Я бы рекомендовал вам использовать новый ES7 синтаксис async/await, они легче понять, чем при использовании .then()

Чтобы использовать его, просто объявить какой-либо метод с префиксом асинхронного и внутри этого использования дождитесь завершения вызова.

например

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(), особенно, когда вы должны сделать несколько звонков в пределах того же метода.

Смежные вопросы