2013-03-08 2 views
2

Предположим, у меня есть функция async, возвращающая обещание. Я хотел бы связать много этих функций, каждый из которых имеет разные аргументы.Как построить массив обещаний jquery?

Функция, которая будет выполнять этот массив выглядит следующим образом:

function executePromiseQueueSync(queue){ 
    var seed = $.Deferred(), 
     finalPromise; 

    _reduce(queue, function(memo, promise){ 
     return memo.then(promise); 
    }, seed.promise()); 

    seed.resolve(); 
    return finalPromise; 
} 

Я видел некоторые функции, принимающие множество обещаний и исполняющих их синхронно. Проблема в том, что я не знаю, как создать такой массив. Пример:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent(someArg)); // WRONG: this is function call and will be executed immediately 

Другой:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent); // WRONG: at some point I will have to apply this with arguments 

Так что - есть способ поставить функцию, возвращающую обещание в массив без его выполнения?

+0

Посмотрите на функцию [bind] (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind). –

+0

Посмотрите на отредактированный вопрос, функция "executePromiseQueueSync". Как привязка поможет мне в этом случае? – mnowotka

+0

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

ответ

1

Update после редактирования:

Ну было бы хорошо, если вы включили эту информацию с самого начала, так что здесь идет попытка.

Я предполагаю, что первый вход известен и который возвращается из последней функции, должен перейти в следующую в списке.

В этом случае мы все еще определить и добавить в очередь, как и раньше:

var promiseQueue = []; 
promiseQueue.push(AsynchEvent); 

Но мы должны изменить ABIT цикла. Я сделаю это для того, чтобы показать, как это можно использовать.

function calcPromise(initialArg) { 
    aggregateArg = initialArg; 
    for (var i = 0; i < myStringArray.length; i++) { 
    aggregateArg = promiseQueue[i](aggregateArg); 
    } 
    return aggregateArg; 
} 

Имейте в виду, что это JavaScript - то, что вы возвращаетесь из одной функции и питает к другому могут быть совершенно различными между двумя итераций этой функции. Например,

  • partnerQueue [0] может ожидать int и возвращать структуру JSON.
  • honestQueue [1] может ожидать структуру JSON и возвращать строку.
  • и так далее.
+0

Посмотрите на вопрос еще раз - он теперь отредактирован. Вы увидите мою проблему. – mnowotka

+0

О, да, возможно, я должен сообщить вам. Я обновил ответ. – fredrik

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