Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
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
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Для объектов JSON, имеющих имена свойств, которые могут меняться, вы можете использовать Dictionary<string, T>
вместо обычного класса, где T
- класс, представляющий данные элемента.
Объявите свои классы как это:
class RootObject
{
public Dictionary<string, User> users { get; set; }
}
class User
{
public string name { get; set; }
public string state { get; set; }
public string id { get; set; }
}
Затем десериализуем следующим образом:
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
Демонстрация:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""users"": {
""10045"": {
""name"": ""steve"",
""state"": ""NY"",
""id"": ""ebb2-92bf-3062-7774""
},
""12345"": {
""name"": ""mike"",
""state"": ""MA"",
""id"": ""fb60-b34f-6dc8-aaf7""
},
""100034"": {
""name"": ""tom"",
""state"": ""WA"",
""id"": ""cedf-c56f-18a4-4b1""
}
}
}";
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
foreach (string key in root.users.Keys)
{
Console.WriteLine("key: " + key);
User user = root.users[key];
Console.WriteLine("name: " + user.name);
Console.WriteLine("state: " + user.state);
Console.WriteLine("id: " + user.id);
Console.WriteLine();
}
}
}
Выход:
key: 10045
name: steve
state: NY
id: ebb2-92bf-3062-7774
key: 12345
name: mike
state: MA
id: fb60-b34f-6dc8-aaf7
key: 100034
name: tom
state: WA
id: cedf-c56f-18a4-4b1