Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
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
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Это специфично для реализации, но ваш интерпретатор, вероятно, интерполирует константы времени компиляции, но не результаты выражений во время выполнения.
В дальнейшем я использую CPython 2.7.3.
Во втором примере выражение "strin"+"g"
оценивается во время компиляции и заменяется на "string"
. Это приводит к тому, что первые два примера ведут себя одинаково.
Если мы рассмотрим байт-коды, мы увидим, что они точно такие же:
# s1 = "string"
2 0 LOAD_CONST 1 ('string')
3 STORE_FAST 0 (s1)
# s2 = "strin" + "g"
3 6 LOAD_CONST 4 ('string')
9 STORE_FAST 1 (s2)
Третий пример включает в себя прогон -time concatenation, результат которого не будет автоматически интернирован:
# s3a = "strin"
# s3 = s3a + "g"
4 12 LOAD_CONST 2 ('strin')
15 STORE_FAST 2 (s3a)
5 18 LOAD_FAST 2 (s3a)
21 LOAD_CONST 3 ('g')
24 BINARY_ADD
25 STORE_FAST 3 (s3)
28 LOAD_CONST 0 (None)
31 RETURN_VALUE
Если вы должны вручную intern()
получить результат третьего выражения, вы получите тот же объект, что и раньше:
>>> s3a = "strin"
>>> s3 = s3a + "g"
>>> s3 is "string"
False
>>> intern(s3) is "string"
True
Случай 1
>>> x = "123"
>>> y = "123"
>>> x == y
True
>>> x is y
True
>>> id(x)
50986112
>>> id(y)
50986112
Случай 2
>>> x = "12"
>>> y = "123"
>>> x = x + "3"
>>> x is y
False
>>> x == y
True
Теперь, ваш вопрос заключается в том, почему идентификатор один и тот же в случае 1, а не в случае 2. В случае 1, вы назначили строковый литерал "123"
на x
и y
.
Так как строка неизменяема, интерпретатор имеет смысл хранить строковый литерал только один раз и указывать все переменные на один и тот же объект. Следовательно, вы видите идентификатор как идентичный.
В случае 2 вы изменяете x
с помощью конкатенации. И x
, и y
имеют одинаковые значения, но не идентичны. Оба указывают на разные объекты в памяти. Следовательно, они имеют разные id
и is
оператор, возвращенные False