调用函数并等待结果
Titanium mvc - call function and wait for result
我目前正在制作我的第一个Titanium iPhone应用程序。
在一个模型中我得到:
(function() {
main.model = {};
main.model.getAlbums = function(_args) {
var loader = Titanium.Network.createHTTPClient();
loader.open("GET", "http://someurl.json");
// Runs the function when the data is ready for us to process
loader.onload = function() {
// Evaluate the JSON
var albums = eval('('+this.responseText+')');
//alert(albums.length);
return albums;
};
// Send the HTTP request
loader.send();
};
})();
,我在视图中调用这个函数:
(function() {
main.ui.createAlbumsWindow = function(_args) {
var albumsWindow = Titanium.UI.createWindow({
title:'Albums',
backgroundColor:'#000'
});
var albums = main.model.getAlbums();
alert(albums);
return albumsWindow;
};
})();
然而,似乎对模型的调用(使用HTTP获取一些数据)不等待响应。在视图中,当我发出警报时,它还没有收到来自模型的数据。我如何以最佳实践的方式做到这一点?
Thanks in advance
OK,
像这样,
function foo(arg1, callback){
arg1 += 10;
....
... Your web service code
....
callback(arg1); // you can have your response instead of arg1
}
you will call this function like this,
foo (arg1, function(returnedParameter){
alert(returnedParameter); // here you will get your response which was returned in above function using this line .... callback(arg1);
});
所以这里arg1是参数(简单的参数,如整数,字符串等…)第二个参数是回调函数
欢呼。
您需要的是对web服务的同步调用,以便它将等待,直到您从服务获得响应。
要在java脚本中实现这一点,您必须将回调函数作为参数传递,并在回调函数中获得返回值,而不是通过返回语句返回值。
实际上你正在使用的编码风格对我来说是新的,因为我正在使用不同的编码风格。
但是最重要的是你必须使用回调函数来检索值,而不是返回语句。试试这个,如果你仍然面临的问题比告诉我,我会尝试给一个例子。
像zero这样的回调方式解释得很好,但是您也可以尝试用事件来处理它。
(function() {
main.ui.createAlbumsWindow = function(_args) {
var albumsWindow = Titanium.UI.createWindow({
title:'Albums',
backgroundColor:'#000'
});
var status = new object(), // eventlistener
got_a_valid_result = false;
// catch result
status.addEventListener('gotResult',function(e){
alert(e.result);
got_a_valid_result = true;
});
// catch error
status.addEventListener('error',function(e){
alert("error occured: "+e.errorcode);
git_a_valid_result = true;
});
var albums = main.model.getAlbums(status);
// wait for result
while (!got_a_valid_result){};
return albumsWindow;
};
})();
和你的模型可能是像
main.model.getAlbums = function(status) {
var loader = Titanium.Network.createHTTPClient();
loader.open("GET", "http://someurl.json");
loader.onload = function() {
var albums = eval('('+this.responseText+')');
status.fireEvent('gotResult',{result:albums});
return albums;
};
loader.onerror = function(e){
status.fireEvent('error',{errorcode:"an error occured"});
};
// Send the HTTP request
loader.send();
};
作为建议,尝试使用JSON。解析而不是eval,因为使用eval有风险,因为它运行所有javascript代码。
我认为Zero发布的解决方案可能对内存管理更好,但我不完全确定。如果您使用eventListener,请注意以下内容(见https://wiki.appcelerator.org/display/guides/Managing +内存+和+发现+泄漏)
function doSomething(_event) {
var foo = bar;
}
// adding this event listener causes a memory leak
// as references remain valid as long as the app is running
Ti.App.addEventListener('bad:idea', doSomething);
// you can plug this leak by removing the event listener, for example when the window is closed
thisWindow.addEventListener('close', function() {
// to remove an event listener, you must use the exact same function signature
// as when the listener was added
Ti.App.removeEventListener('bad:idea', doSomething);
});
相关文章:
- 正在等待HTTP调用从函数返回结果
- 如何等待一个HTML页面并在页面复杂创建时获得结果
- 如何在js中等待if语句内部的结果
- JS GeoLocation:让$.ajax等待结果
- 等待ajax结果绑定淘汰模型
- 等待异步结果的 Chrome 系统调用
- 让 JavaScript 函数等待 Jquery 对话框模态的结果
- 我怎样才能异步执行 JavaScript 代码片段并等待它们的结果
- 我是否需要为每个具有等待结果回调的方法关闭
- 等待异步 Javascript 函数结束检索结果(延迟?)
- 在返回结果之前,我如何等待 jQuery.ajaxComplete in promise.done
- 如何在从 Meteor.method 返回之前等待子进程结果
- 使用'解决'以等待routeProvider中的查询结果
- jQuery递归获取等待结果
- 在所有类型的DOM等待机制中,将AMD javascript计算为库中的非AMD结果是未定义的
- 我怎么能等待谷歌远程呼叫返回我的结果之前继续
- 调用函数并等待结果
- 在执行之前等待链接点击弹出结果
- 等待回调函数的结果之前,另一个回调函数
- JavaScript异步回调-如何等待最终结果