2013-03-26 2 views
1

Я знаю, что есть много вопросов по этому вопросу, но все они адаптированы к конкретному случаю. Я задаю этот вопрос и надеюсь на ответ, который каждый может использовать, рассматривая этот вопрос.Правильное объяснение порядка выполнения JavaScript

Скажем, у меня есть три функции, которые нужно выполнить в порядке, и все они делают что-то асинхронное.

Для двух функций это просто с обратным вызовом:

var fOne = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fTwo = function() { 
    // do stuff 
}; 

Призвание:

fOne(fTwo); 

Делает fTwo быть запущен после того, как FONE завершена. Как добавить fThree в этот случай, чтобы он запускался после fTwo, который запускается после fOne?

+0

зависит, когда вы хотите fThree выполнить – Huangism

+1

Это не имеет ничего общего с JQuery. – 0x499602D2

+0

отредактировал мой вопрос соответственно – Difusio

ответ

2

В принципе, если я правильно понимаю ваш вопрос, вам нужно передать лямбду в fOne, чтобы иметь возможность добавлять аргументы в fTwo, а затем fTwo собирать обратный вызов и называть его как fOne.

var fOne = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fTwo = function(callback) { 
    // do stuff 
    callback(); 
}; 

var fThree = function() { 
    // do stuff 
}; 

fOne(function() { fTwo(fThree); }); // <- lambda 
1

Поскольку вы не используете отсроченных и обещает запустить одновременно асинхронный действия, а только начинается один, когда другой закончил, добавив третий идет почти одинаково:

var fOne = function(callback) { 
    console.log('1') 
    callback(); 
}; 

var fTwo = function(callback) { 
    console.log('2') 
    callback(); 
}; 

var fThree = function() { 
    console.log('3') 
}; 

fOne(function() { 
    fTwo(function() { 
     fThree(); 
    }); 
}); 

FIDDLE

+1

Это все еще не дает правильный результат для меня, будет ли использовать отложенные варианты лучше? – Difusio

+0

Выполняет функции в полном порядке, какой результат вы ожидаете? – adeneo

+0

Думаю, я не дал достаточно информации. fOne и fTwo оба заполняют iframe содержимым. Они должны делать это один за другим из-за проблем с регистрацией. Поэтому fTwo находится в обратном вызове fOne. В fTwo весь мой код находится в блоке .load, где нажата кнопка, ведущая на вторую страницу. fThree не может быть вызван до тех пор, пока не будет выполнена новая загрузка, я начинаю думать, что моя проблема там. – Difusio

1

еще один подход, который я придумал:

var stack = [fOne, fTwo, fThree]; 
stack.shift()(function() { 
    stack.shift()(stack[0]); 
}); 

Где вы определяете functins как:

function fOne(callback) { 
    setTimeout(function() { // <-- example of async task 
     alert('fOne done'); 
     callback && callback(); 
    }, 1000); 
} 

http://jsfiddle.net/kRMr8/2/

Смежные вопросы