2016-08-23 5 views
3

мне нужно выполнить 2 функции один за другим с материалом в функции «А» полностью завершает до вещи в функции «B» выполняет ...Jquery - Цепные функции с отсроченных и обещаниями, но без SetTimeout

Я не могу найти пример, который не использует setTimeout .., что странно ...

У меня следующий пример (from here), он должен работать? Как я могу проверить, работает ли он? Какой фиктивный код можно использовать для имитации части «// делать вещи с помощью SharePoint JSOM», например, от 5 секунд до 30 секунд.

var a = function() { 
var defer = $.Deferred(); 

//do stuff with SharePoint JSOM 

console.log('a() called'); 

return defer; 
}; 

var b = function() { 
var defer = $.Deferred(); 

console.log('b() called'); 


return defer; 
}; 



a().then(b); 
+0

Да, просто используйте 'setTimeout' как манекен. – Bergi

+0

Если 'b' не делает ничего асинхронного, он не должен возвращать отложенное (или обещание). 'then' также работает с синхронными обратными вызовами. – Bergi

+0

в соответствии с тем, что я тестировал и читал, вы не можете использовать setTimeout как манекен, поскольку он просто не останавливает код вызова. И я не могу использовать заранее установленные задержки. –

ответ

4

Простое использование promise (ваниль JS) и приковать их then.

function a() { 
 
    return new Promise(function(resolve) { 
 
     console.log("wait two seconds ..."); 
 

 
     // this timeout is only here for demo purpose ;) 
 
     setTimeout(function() { 
 
      console.log("A"); 
 
      resolve(); 
 
     }, 2000); 
 
    }); 
 
} 
 

 
function b() { 
 
    console.log("B"); 
 
} 
 

 
a().then(b);

Если вы хотите использовать JQuery deffered его почти то же самое.

function a() { 
 
    var defer = $.Deferred(); 
 
    
 
    console.log("wait two seconds ..."); 
 

 
    // this timeout is only here for demo purpose ;) 
 
    setTimeout(function() { 
 
     console.log("A"); 
 
     defer.resolve(); 
 
    }, 2000); 
 
    
 
    return defer; 
 
} 
 

 
function b() { 
 
    console.log("B"); 
 
} 
 

 
a().then(b);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

Привет, я знаю об этом, Но было просто интересно получить рабочий пример, используя обещания jquery ... –

+0

Хорошо, обновил мой ответ @ Zertix.net – eisbehr

+0

Но не устанавливаетTimeout фиксирует время ожидания 2000 мс? Я не хочу фиксированного таймаута. Я хочу, чтобы B выполнялся всякий раз, когда A заканчивался естественным образом. –