Javascript 用承诺回应本机NetInfo
我在react native中有一个修改过的代码,用于使用服务器获取数据,效果很好。我想添加NetInfo,以便在提取之前始终检查电话是否连接到internet。在承诺中它是可能的吗?如何将此异步函数连接到我的代码Javascript 用承诺回应本机NetInfo,javascript,asynchronous,promise,react-native,Javascript,Asynchronous,Promise,React Native,我在react native中有一个修改过的代码,用于使用服务器获取数据,效果很好。我想添加NetInfo,以便在提取之前始终检查电话是否连接到internet。在承诺中它是可能的吗?如何将此异步函数连接到我的代码 'use strict'; var MAX_WAITING_TIME = 30000 var processStatus = function (response) { // status "0" to handle local files fetching (e.g.
'use strict';
var MAX_WAITING_TIME = 30000
var processStatus = function (response) {
// status "0" to handle local files fetching (e.g. Cordova/Phonegap etc.)
if (response.status === 200 || response.status === 0 || response.status === 201 || response.status === 422 || response.status === 302 ) {
return Promise.resolve(response)
} else if(response.status === 413) {
return Promise.reject(alert(____mobile.connection_error.large_file))
} else {
//return Promise.reject(alert("Process status: "+JSON.stringify(response )))
return Promise.reject(alert(____mobile.connection_error.top));
console.log("Process status: "+JSON.stringify(response ));
}
};
var parseJson = function (response) {
return response.json();
};
var getWrappedPromise = function () {
var wrappedPromise = {},
promise = new Promise(function (resolve, reject) {
wrappedPromise.resolve = resolve;
wrappedPromise.reject = reject;
});
wrappedPromise.then = promise.then.bind(promise);
wrappedPromise.catch = promise.catch.bind(promise);
wrappedPromise.promise = promise;// e.g. if you want to provide somewhere only promise, without .resolve/.reject/.catch methods
return wrappedPromise;
};
/* @returns {wrapped Promise} with .resolve/.reject/.catch methods */
var getWrappedFetch = function () {
var wrappedPromise = getWrappedPromise();
var args = Array.prototype.slice.call(arguments);// arguments to Array
fetch.apply(null, args)// calling original fetch() method
.then(function (response) {
wrappedPromise.resolve(response);
}, function (error) {
// wrappedPromise.reject(alert("Fetch status: " + error));
wrappedPromise.reject(____mobile.connection_error.top);
console.log("Fetch status: " + error);
})
.catch(function (error) {
wrappedPromise.catch(error);
});
return wrappedPromise;
};
/**
* Fetch JSON by url
* @param { {
* url: {String},
* [cacheBusting]: {Boolean}
* } } params
* @returns {Promise}
*/
var postJSON = function (params) {
var headers1 = {}
if (params.json){
headers1 = {
'Accept': 'application/json',
'Content-Type': 'application/json'}
}
if (params.headersIn){
headers1 = params.headersIn
}
var methodTmp = 'POST'
if (params.methodIn) {
methodTmp = params.methodIn
}
console.log(methodTmp)
var wrappedFetch = getWrappedFetch(
params.cacheBusting ? params.url + '?' + new Date().getTime() : params.url,
{
method: methodTmp,//'POST',// optional, "GET" is default value
headers: headers1,
body: params.send_data
});
var timeoutId = setTimeout(function () {
wrappedFetch.reject(alert(____mobile.connection_error.timeout, ____mobile.connection_error.check_connection));// reject on timeout
}, MAX_WAITING_TIME);
return wrappedFetch.promise// getting clear promise from wrapped
.then(function (response) {
clearTimeout(timeoutId);
return response;
})
.then(processStatus)
.then(parseJson);
};
module.exports = postJSON;
实现NetInfo.isConnected.fetch()的最基本方法是什么?因此,fetched只能在有internet连接的情况下工作
编辑:
我想使用:
NetInfo.isConnected.fetch()
是的,我必须重写这段代码,而不是使用getWrappedPromise,现在我想是时候了
EDIT2:好的,我重构了这个代码片段,希望它更好。欢迎任何意见。我已测试,不确定是否仍需要此NetInfo.isConnected.fetch()。现在没有错误,没有连接,或者我遗漏了什么?
新代码:
var processStatus = function (response) {
if (response == undefined) {
return null
}
// status "0" to handle local files fetching (e.g. Cordova/Phonegap etc.)
if (response.status === 200 || response.status === 0 || response.status === 201 || response.status === 422 || response.status === 302 ) {
return Promise.resolve(response)
} else if(response.status === 413) {
return Promise.reject(alert(____mobile.connection_error.large_file))
} else {
//return Promise.reject(alert("Process status: "+JSON.stringify(response )))
console.log("Process status: "+JSON.stringify(response ));
return Promise.reject(alert(____mobile.connection_error.top));
}
};
var parseJson = function (response) {
if (response == undefined) {
return null
}
return response.json();
};
var postJSON = function (params) {
var headers1 = {}
if (params.json){
headers1 = {
'Accept': 'application/json',
'Content-Type': 'application/json'}
}
if (params.headersIn){
headers1 = params.headersIn
}
var methodTmp = 'POST'
if (params.methodIn) {
methodTmp = params.methodIn
}
console.log(methodTmp)
var fetchPromise = fetch(params.cacheBusting ? params.url + '?' + new Date().getTime() : params.url,
{
method: methodTmp,//'POST',// optional, "GET" is default value
headers: headers1,
body: params.send_data
})// calling original fetch() method
.then(function (response) {
return response;
}, function (error) {
console.log("Fetch status: " + error);
return fetch
}).then(processStatus)
.then(parseJson);
// timeoutId = setTimeout(function () {
// wrappedFetch.reject(alert(____mobile.connection_error.timeout, ____mobile.connection_error.check_connection));// reject on timeout
// }, MAX_WAITING_TIME);
return fetchPromise
};
getWrappedPromise
-哎哟!由于某种原因,不推荐使用延迟模式。为什么不正确地使用Promise
构造函数呢?getWrappedFetch
在很多级别上都是错误的。它的目的是什么?直接使用fetch
。“如何将这个异步函数连接到我的代码?”-你说的是哪个函数?请发布它,即使它尚未正确连接到您的代码。编辑了我的问题并发布了我要添加的功能。现在是重写它并摆脱wrappedPromise的好时机。我想是什么意思。获取返回,你想对结果做什么?getWrappedPromise
-哎哟!由于某种原因,不推荐使用延迟模式。为什么不正确地使用Promise
构造函数呢?getWrappedFetch
在很多级别上都是错误的。它的目的是什么?直接使用fetch
。“如何将这个异步函数连接到我的代码?”-你说的是哪个函数?请发布它,即使它尚未正确连接到您的代码。编辑了我的问题并发布了我要添加的功能。现在正是重写它并摆脱wrappedPromise的好时机我想是什么意思。fetch
return,你想对结果做什么?