2013-04-30 2 views
0

Есть ли какие-либо существующие api/code для обработки и цепочки длинных «асинхронных» функций javascript?Задача/Action-api для JavaScript?

Прежде всего, я не думаю, что в js есть какая-то такая функция, как асинхронная функция? Я предполагаю, что единственный asynch api - это http-запрос, который использует jQuery или я ошибаюсь?

В любом случае при использовании jQuery для первого, например, для ping-сервера, а затем для входа в систему, а затем для загрузки кучи элементов и т. Д., Это не очень красиво обернуть эти функции в обработчиках завершенных обработчиков, если вы знаете, что я имею в виду.

Что я сейчас сделал, это определить класс Task с некоторыми возможностями связанного списка с помощью свойства task.next и т. Д. Когда я подключаю эти и выполняю task.run поначалу, я разработал это так, что каждая задача запускается, и когда ее обработчик завершен, он запускает задачу task.next и т. д.

Это прекрасно работает, но мне интересно, существует ли какая-либо существующая более полная apis для этого allready там I следует использовать?

Maybee с поддержкой отмены, прогресса, агрегации исключений и т. Д.?

Maybee Есть планы аналогичных задач async/wait, как есть в C# сейчас, но в js?

+1

Вы сделали какие-либо исследования в этой области? Вы видели [jquery отложен] (http://api.jquery.com/category/deferred-object/) или [q] (https://github.com/kriskowal/q) или [taks.js] (http : //taskjs.org/)? Существует даже [spec] (http://wiki.commonjs.org/wiki/Promises/A) ... – nemesv

+0

Нет, я просил вас;) Извините, я искал, но, вероятно, слишком устал тоже. –

ответ

0

Если вы нацеливаетесь на браузер, вы можете использовать setTimeout .. и разбивать свой код на функции, при этом каждое итерация занимает одно из стека/очереди и делает эту часть .. есть также веб-сотрудники ...

Если вы используете серверную JS (например, NodeJS), то есть библиотеки, которые упрощают управление задачами async. В браузере это берет работу ... Вы по существу хотите создать пакет задач, и работа их ..

function processBundle(tasks, callback) { 
    var hnd = setTimeout(doWork, 20); 

    function doWork() { 
    var item = tasks.shift(); 
    item(); 
    return (
     tasks.length 
     ? setTimeout(doWork, 20) 
     : callback() 
    ); 
    } 
} 

//using it... 
var items = []; 
items.push(simpleFunction1); 
... 
items.push(simpleFunctionN); 
processBundle(items, function(){ 
    alert("done!"); 
});