Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
var async = require("async");
// This wires up result back to the caller
var result = {};
var asyncTasks = [];
asyncTasks.push(function(_callback){
// some asynchronous operation
$.ajax({
url: '...',
success: function(response) {
result.response = response;
_callback();
}
});
});
async.parallel(asyncTasks, function(){
// result is available after performing asynchronous operation
console.log(result)
console.log('Done');
});
Я использую объект result
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Если главная цель сохранения пользовательских компонентов на стороне серверов - это иметь возможность показывать один и тот же интерфейс пользователю - почему бы не сохранить всю описательную информацию, необходимую вам о компонентах пользователей, и когда это необходимо - просто снова перестроить пользовательский интерфейс, используя хранимую описательную информацию? Вот пример:
/* That is the class for storing information, which you need from your components*/
public class DropedComponentsCoordinates implements Serializable{
private String componentID;
private String x_coord;
private String y_coord;
//and so on, whatever you need to get from yor serializable objects;
//getters and setters are assumed but not typed here.
}
/* I assume a variant with using FXML. If you don't - the main idea does not change*/
public class YourController implements Initializable {
List<DropedComponentsCoordinates> dropedComponentsCoordinates;
@Override
public void initialize(URL url, ResourceBundle rb) {
dropedComponentsCoordinates = new ArrayList();
}
//This function will be fired, every time
//a user has dropped a component on the place he/she wants
public void OnDropFired(ActionEvent event) {
try {
//getting the info we need from components
String componentID = getComponentID(event);
String component_xCoord = getComponent_xCoord(event);
String component_yCoord = getComponent_yCoord(event);
//putting this info to the list
DropedComponentsCoordinates dcc = new DropedComponentsCoordinates();
dcc.setX_Coord(component_xCoord);
dcc.setY_Coord(component_yCoord);
dcc.setComponentID(componentID);
} catch (Exception e) {
e.printStackTrace();
}
}
private String getComponentID(ActionEvent event){
String componentID;
/*getting cpmponentID*/
return componentID;
}
private String getComponent_xCoord(ActionEvent event){
String component_xCoord;
/*getting component_xCoord*/
return component_xCoord;
}
private String getComponent_yCoord(ActionEvent event){
String component_yCoord;
/*getting component_yCoord*/
return component_yCoord;
}
}
Вы правы, JavaFX (по состоянию на 2.1) не поддерживает сериализацию компонентов с использованием интерфейса Java Serializable - поэтому вы не можете использовать этот механизм.
JavaFX может десериализоваться из FXML-документ, использующий метод FXMLLoader.load () .
Трюк заключается в том, как записать ваши существующие компоненты и состояния в FXML?
Существует обсуждение форума о сериализации в FXML.
В настоящее время на платформе, которая выполняет сериализацию FXML, нет ничего публичного. По-видимому, создание родового сценария => сериализатор FXML - довольно сложная задача (и для этого я не знаю публичного стороннего API). Было бы не слишком сложно перебирать сценарий и записывать FXML для ограниченного набора компонентов и атрибутов.