Javascript Uncaught TypeError:undefined不是Tianium中request()的函数
我的一个函数有问题。 在app.js中,ia具有以下功能:Javascript Uncaught TypeError:undefined不是Tianium中request()的函数,javascript,android,titanium,Javascript,Android,Titanium,我的一个函数有问题。 在app.js中,ia具有以下功能: //Including all functions Ti.include('functions.js'); //Including the login screen Ti.include('login.js'); //Including the register screen Ti.include('register.js'); 因此,所有函数都高于可以调用函数的其他文件 在login.js中,我有以下代码: //'login'
//Including all functions
Ti.include('functions.js');
//Including the login screen
Ti.include('login.js');
//Including the register screen
Ti.include('register.js');
因此,所有函数都高于可以调用函数的其他文件
在login.js中,我有以下代码:
//'login' is the type
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
Ti.API.info('request: ' + request);
if(request == true) {
alert('You are loggedin');
} else {
alert('Something went wrong');
}
请求函数如下所示:
function request(type, username, password) {
//Database connection
var db = Ti.Network.createHTTPClient();
db.open('POST', 'http://myip/mobile_app/');
Ti.API.info('type: ' + type);
Ti.API.info('username: ' + username);
Ti.API.info('password: ' + password);
//If variables has been send
db.onload = function() {
var answer = this.responseText;
Ti.API.info('type answer: ' + typeof this.responseText);
if(answer == 'true') {
Ti.API.info('TEST');
return true;
} else {
return false;
}
};
//Variables to send
db.send({
type: type,
username: username,
password: md5(password)
});
//If there is an error
db.onerror = function(e) {
Ti.API.info('error: ' + JSON.stringify(e));
};
}
我知道this.responseText返回true,函数md5()
也可以工作。
我知道这一点,因为我还测试了login.js,代码如下:
Ti.API.info('request: ' + request('login', loginUsernameInput.value, md5(loginPasswordInput.value)));
if(request('login', loginUsernameInput.value, md5(loginPasswordInput.value)) == true) {
alert('You are loggedin');
} else {
alert('Something went wrong');
}
上面还返回函数请求()
是未定义的
因此,一旦尝试登录,我就会出现以下错误:
因此,我的问题是如何解决错误?我认为问题在于您将变量request
重新定义为函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的
现在,您将请求设置为未定义。您不能再使用request()
,因为您已经重写了它
尝试将未定义的值作为函数调用时,会导致未定义的值不是函数
请参见演示:我认为问题在于您将变量request
重新定义为函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的
现在,您将请求设置为未定义。您不能再使用request()
,因为您已经重写了它
尝试将未定义的值作为函数调用时,会导致未定义的值不是函数
请参见演示:我认为问题在于您将变量request
重新定义为函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的
现在,您将请求设置为未定义。您不能再使用request()
,因为您已经重写了它
尝试将未定义的值作为函数调用时,会导致未定义的值不是函数
请参见演示:我认为问题在于您将变量request
重新定义为函数request
的返回值。您请求的函数不返回任何内容。因此,它返回未定义的
现在,您将请求设置为未定义。您不能再使用request()
,因为您已经重写了它
尝试将未定义的值作为函数调用时,会导致未定义的值不是函数
参见演示:事实上,@Gabs00说您正在重新定义请求变量是正确的
但真正的问题是你如何避免这个问题
答案就在于你的编码方式。通过使用Ti.include,您没有使用钛推荐的最佳实践
相反,您应该这样做:
在文件models/User.js中:
exports.request = function(type, username, password) {
// Your code here
};
然后,不要写(在你的app.js文件中):
您将有:
var User = require('models/User');
User.request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
但即使有了这个代码,它也不够令人满意。。。
您可能应该尝试的是根据您的请求声明尽可能多的函数。即使现在你的代码对于你的2个请求来说是通用的,我可以向你保证不会太长
因此,我推荐最后一个代码:
在您的models/User.js文件中:
Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
// Your code
};
exports.login = function(username, password) {
request('login', username, password);
};
exports.register = function(username, password) {
request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
这段代码的酷之处在于,您的请求方法得到了完全保护:唯一可以访问此函数的代码是在models/User.js文件中编写的代码。对于其他人来说,这个函数甚至不存在
在你的app.js文件中:
Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
// Your code
};
exports.login = function(username, password) {
request('login', username, password);
};
exports.register = function(username, password) {
request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
我认为这样更容易阅读,不是吗
如果您想了解有关此模式的更多信息,您可能应该阅读以下文章:
正如您将看到的,您也应该在windows中重用此模式(您的Ti.include('login.js');和Ti.include('register.js');)事实上,@Gabs00说您正在重新定义请求变量是正确的
但真正的问题是你如何避免这个问题
答案就在于你的编码方式。通过使用Ti.include,您没有使用钛推荐的最佳实践
相反,您应该这样做:
在文件models/User.js中:
exports.request = function(type, username, password) {
// Your code here
};
然后,不要写(在你的app.js文件中):
您将有:
var User = require('models/User');
User.request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
但即使有了这个代码,它也不够令人满意。。。
您可能应该尝试的是根据您的请求声明尽可能多的函数。即使现在你的代码对于你的2个请求来说是通用的,我可以向你保证不会太长
因此,我推荐最后一个代码:
在您的models/User.js文件中:
Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
// Your code
};
exports.login = function(username, password) {
request('login', username, password);
};
exports.register = function(username, password) {
request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
这段代码的酷之处在于,您的请求方法得到了完全保护:唯一可以访问此函数的代码是在models/User.js文件中编写的代码。对于其他人来说,这个函数甚至不存在
在你的app.js文件中:
Ti.include('functions.js');
var request = request('login', loginUsernameInput.value, md5(loginPasswordInput.value));
function request(type, username, password) {
// Your code
};
exports.login = function(username, password) {
request('login', username, password);
};
exports.register = function(username, password) {
request('register', username, password);
};
var User = require('models/User');
User.login(loginUsernameInput.value, md5(loginPasswordInput.value));
我认为这样更容易阅读,不是吗
如果您想了解有关此模式的更多信息,您可能应该阅读以下文章:
正如您将看到的,您也应该在windows中重用此模式(您的Ti.include('login.js');和Ti.include('register.js');)事实上,@Gabs00说您正在重新定义请求变量是正确的
但真正的问题是你如何避免这个问题
答案就在路上