Еще один подход к возврату значения из асинхронной функции - передать объект, который сохранит результат от асинхронной функции.
Вот пример того же:
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
для хранения значения во время асинхронной операции. Это позволяет получить результат даже после асинхронного задания.
Я использую этот подход много. Мне было бы интересно узнать, насколько хорошо этот подход работает, когда задействован результат обратно через последовательные модули.
Это имеет смысл, потому что elmnt.options
в последнем фрагменте - массив, заполненный значениями undefined
. Значит, вы знаете количество элементов, но не их ценности. Причина в том, что узлы DOM не могут быть переданы из контекста страницы. docs говорят:
Примечание. Аргументы и возвращаемое значение функции оценки должны быть простым примитивным объектом.
Замыкания, функции, узлы DOM и т. Д. Будут работать не !
g4] g3> / blockquote>Итак, либо вы делаете все внутри контекста страницы (
evaluate
), либо получаете представление узлов DOM, с которыми вы хотите работать. Я думаю, это не то, что вы хотите.var elmnt = this.evaluate(function () { return [].map.call(document.getElementsByName("symbol")[0].options, function(option){ return {text: option.innerText, value: option.value}; }); });