В то время как обещания и обратные вызовы хорошо работают во многих ситуациях, боль в задней части выражает нечто вроде:
if (!name) {
name = async1();
}
async2(name);
. В итоге вы пройдете через async1
; проверьте, не определено ли name
или нет, и соответственно вызовите обратный вызов.
async1(name, callback) {
if (name)
callback(name)
else {
doSomething(callback)
}
}
async1(name, async2)
Хотя в в порядке хорошо , это раздражает, когда у вас много подобных случаев и обработка ошибок. Вы можете проверить проект здесь . Fibers
помогает в решении проблемы. var Fiber = require('fibers')
function async1(container) {
var current = Fiber.current
var result
doSomething(function(name) {
result = name
fiber.run()
})
Fiber.yield()
return result
}
Fiber(function() {
var name
if (!name) {
name = async1()
}
async2(name)
// Make any number of async calls from here
}
Функциональный объект в JavaScript - это одно. Вызов функции - это другое дело. Вы используете последний, включив круглые скобки после имени функции *, но вам нужен первый, без круглых скобок. Это позволяет setTimeout
позже вызвать эту функцию, используя переданный объект. Предполагая, что вам действительно нужно 5 секунд (а не 50 секунд, которые использовал исходный код):
setTimeout(GetUsersNumber, 5000);
* Действительно, любая старая переменная, содержащая объект функции, может быть вызвана так, но для удобства определение функции также определяет имя переменной для нее.
setTimeout принимает функцию как параметр. То, что вы делаете, сразу же выполняет функцию и передает возвращаемое значение функции exected. Пропустите GetUsersNumber
вместо GetUsersNumber()
. () уже выполняет функцию.
setTimeout(GetUsersNumber, 50000);
На боковой ноте:
if(window.XMLHttpRequest)