Вот более краткий ответ для людей, которые ищут быструю ссылку, а также некоторые примеры с использованием обещаний и асинхронных / ожидающих.
Начните с наивного подхода (который не работает) для функция, вызывающая асинхронный метод (в данном случае setTimeout
) и возвращает сообщение:
function getMessage() {
var outerScopeVar;
setTimeout(function() {
outerScopeVar = 'Hello asynchronous world!';
}, 0);
return outerScopeVar;
}
console.log(getMessage());
undefined
регистрируется в этом случае, поскольку getMessage
возвращается до вызова setTimeout
и обновления outerScopeVar
.
Двумя основными способами его решения являются обратные вызовы и обещания:
Обратные вызовы
Здесь изменение состоит в том, что getMessage
принимает параметр callback
, который будет вызываться для доставки результатов обратно к вызывающему коду после его доступности.
function getMessage(callback) {
setTimeout(function() {
callback('Hello asynchronous world!');
}, 0);
}
getMessage(function(message) {
console.log(message);
});
Обещания предоставляют альтернативу который является более гибким, чем обратные вызовы, потому что их можно комбинировать естественно для координации нескольких асинхронных операций. Стандартная реализация Promises / A + изначально представлена в node.js (0.12+) и многих текущих браузерах, но также реализована в таких библиотеках, как Bluebird и Q .
function getMessage() {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Hello asynchronous world!');
}, 0);
});
}
getMessage().then(function(message) {
console.log(message);
});
jQuery Отложенные
jQuery предоставляет функциональные возможности, аналогичные обещаниям с его отсрочкой.
function getMessage() {
var deferred = $.Deferred();
setTimeout(function() {
deferred.resolve('Hello asynchronous world!');
}, 0);
return deferred.promise();
}
getMessage().done(function(message) {
console.log(message);
});
async / await
Если ваша среда JavaScript включает поддержку async
и await
(например, Node.js 7.6+), то вы может использовать обещания синхронно в пределах функций async
:
function getMessage () {
return new Promise(function(resolve, reject) {
setTimeout(function() {
resolve('Hello asynchronous world!');
}, 0);
});
}
async function main() {
let message = await getMessage();
console.log(message);
}
main();
Это проблема с вашей оболочкой. Поместите аргумент в кавычки.
Вы можете избежать амперсанда с обратной косой чертой:
$ python args.py -a http://www.website.com?optionone=one\&numbertwo=two