2013-08-18 4 views
0

если я делаю:JQuery - запустить несколько методов последовательно

method(); 
method(); 

оба вызова будут работать параллельно (одновременно)

я просто хотел бы сделать второй метод(); дождитесь первого метода(); закончен прежде, чем начать, и сделать это динамически, потому что я не могу знать, сколько раз я запустил метод(); в то же время .

Возможно ли это?

только, например, тех, кто работает в то же время, как я могу видеть ... http://jsfiddle.net/Lcgb8/

+0

Javascript не поддерживает многопоточность. Вы говорите об AJAX? Если да, используйте обещания. – SLaks

+0

Используйте обратный вызов ... – epascarello

+0

, если вы выполняете то, что вы описываете в своем коде, не используя (fileReader, Xhr, Canvas или что-то другое async), он будет делать это последовательно. Ваш пример выполняется последовательно. – cocco

ответ

2

Вы можете использовать then, если вы вернете Deferred.

E.g.

function method() { 
    var d = $.Deferred(); 

    //do something async 
    setTimeout(function() { 
     d.resolve('some data'); //inform listeners that the process is completed 
    }, 2000); 

    return d; //return the deferred object 
} 

Тогда вы могли бы сделать:

method().then(method).then(method).then(method); 

Обратите внимание, что возвращаемое значение каждого вызова будет передан в качестве первого аргумента для следующего вызова, соответственно.

EDIT: Вот пример того, как можно динамически выполнять операции async.

FIDDLE

function changeColorAsync(color) { 
    var d = $.Deferred(); 

    setTimeout(function() { 
     $('body').css('background', color); 

     d.resolve(); 

    }, 4000); 

    return d; 
} 

$(function() { 
    $('#color-form').on('submit', function (e) { 
     var color = $(this).find(':checked').val(), d; 

     d = d? 
      d.then(changeColorAsync.bind(this, color)) : 
      changeColorAsync(color); 

     return false; 
    }); 
}); 
+0

проблема в том, что я не могу теперь, сколько раз я вызову метод(); cause method() вызывается после получения данных в веб-кластере – sbaaaang

+0

, это пример, где _data возвращается из веб-кластера случайно. http://jsfiddle.net/Lcgb8/ – sbaaaang

+0

@sbaaaang Возможно, вы могли бы сделать что-то вроде этого http: // jsfiddle .net/Lcgb8/2/ – plalx

0

Посмотрите jQuery.queue().

+0

Я спрошу слишком много, если я попрошу вам небольшой пример: P? пожалуйста, – sbaaaang

+1

@sbaaaang: Как насчет примера на странице документации, с которой связан Маттиас? – RichieHindle

+0

Я искренне не понимаю, как использовать его из примера, так как он использует странную «fx» через очередь, которая не знает, что есть:/ – sbaaaang

-1
 $("div").promise().done(function() { 
    $("p").append(" Finished! "); 
    }); 

Надежда этот пример должен быть очищен ваш запрос

LIVE DEMO

Javascript, и большинство других языков, запускать код последовательно.

Поэтому они оба не будут работать одновременно.

В самом деле, невозможно одновременно запускать две разные части кода Javascript. Однако на многих других языках можно использовать потоки.

Однако, если они совершают вызовы AJAX, соответствующий серверный код, вызываемый обеими функциями, будет выполняться одновременно. Чтобы предотвратить это, вам необходимо сделать первую функцию, принимающую параметр обратного вызова, и передать ей вторую функцию.

+0

Вот что плакат уже делает ... – epascarello

+0

Мне нужно сделать это динамически. Я предполагаю, что очередность является единственным решением – sbaaaang

+0

или создайте массив методов, затем запустите его один за другим, но проблема остается, потому что я должен быть уверен, что предыдущий метод закончен, прежде чем запускать следующий. – sbaaaang

0

Использование callback:

var test = function (letter, callback) { 
    console.log(letter); 

    if (typeof callback !== 'undefined') { 
     callback(); 
    } 
}; 

Теперь вы можете запустить его:

test('a', function() { 
    test('b', function() { 
     test('c') 
    }); 
}); 

В результате в консоли:

a 
b 
c 

Является ли это полезно для вас?

+0

спасибо, но не полезно запускать ваш код, вам нужно знать, сколько методов() вы собираетесь запускать, я не знаю, что он должен быть динамически поставлен в очередь, если это возможно: P – sbaaaang

+0

функция метод (a) {console.log (a)}; метод ('a'); метод ('b'); метод ('c'); делает то же самое. – cocco

+0

они работают одновременно? – sbaaaang

1

Вот последовательно анимации с использованием transitionend

<!doctype html> 
<html> 
<head> 
<meta charset="utf-8"> 
<title>animation</title> 
<style> 
div{ 
width:50px;height:50px;background-color:#093; 
-webkit-transition:all 300ms ease; 
} 
div.move{-webkit-transform:translate3d(200px,0,0);}/*GPU HW acceleration*/ 
</style> 
<script> 
(function(W){ 
var D,d,L,c=0; 
function init(){ 
    D=W.document;d=D.getElementsByTagName('div');L=d.length;var l=d.length; 
    while(l--){d[l].addEventListener('transitionend',next,false)} 
    next(); 
} 
function next(){ 
    d[c].classList[(d[c].className=='move'?'remove':'add')]('move'); 
    c++;c=(c==L?0:c); 
} 
W.addEventListener('load',init,false); 
})(window) 
</script> 
</head> 
<body><div></div><div></div><div></div><div></div></body> 
</html> 

она маленькая ошибка исправлена ​​..

поддерживает бесконечные Див и это бесконечный цикл, используя низкие ресурсы. =)

ваш method() бы мой next()

если кто-то хочет, чтобы jsfiddle это ... я не использовать.

ps .: чистый javascript (без jquery) + css3 (с префиксом -webkit);

пример

http://jsfiddle.net/4eujG/