2015-08-17 2 views
3

Скажем, у меня есть массив и функция A:выполнить функцию от элементов массива в последовательности

var array = ['a', 'b', 'c']; 
function A(p) { ... }; 

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

array.forEach(function(item) { 
    A(item); 
} 

однако, если есть некоторые асинхронные действия в A, все становится перепутались. поэтому вопрос стоит:

Как я могу выполнить их упорядоченное, даже если в A есть асинхронные действия?

Под этим я подразумеваю, что A ('b') должен быть выполнен после завершения A ('a') (включая все асинхронные действия там).

Я полагаю, что, должно быть, некоторые утилиты уже делали такие вещи. может кто-то пролил мне немного света?

+0

ли вы пытаетесь передать функцию? A как параметр foreEach вместо его обертывания? – fubbe

+1

В вашей текущей форме это в основном невозможно, так как функция 'A' принимает только один параметр и не имеет возможности уведомлять сервер, когда он завершает свои работы (обратные вызовы), поэтому сервер не может решить, будет ли' A ('b') 'завершен или нет. – fuyushimoya

+0

@fubbe Я думаю, это работает так же. нет никаких гарантий асинхронных действий в A. – yaoxing

ответ

7

Это идеальный вариант использования «eachSeries» от async.js

Вы могли бы использовать его таким образом

async.eachSeries(array, A, function(err) { 
    // this function gets called at the end 
    // after your array has been looped 
}); 

И вы должны изменить свой Функция со вторым параметром - обратный вызов.

function A(p, callback) { 
    // ... 
    return callback(); 
} 

Это вызов параметра обратного вызова после завершения асинхронных вызовов в A.

+0

OK Я попробую. Странно, что в асинхронном документе он упомянул этот метод, но подробно об этой функции не было. Я думал, что это псевдоним «каждый». Я попытаюсь вернуться через некоторое время. – yaoxing

+0

ОК, это то, что я ищу. Спасибо за ответ. и теперь я знаю, почему я пропустил это. Было примечание, в котором говорилось: ' Series - то же самое, что и , но запускает только одну операцию async за раз. Я просто пропустил это. – yaoxing

+0

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

3

JavaScript Promises позволяет вам делать именно это.

Этот пример довольно запутанным, но это показывает некоторые аспекты использования Promises:

var arr = ['a', 'b', 'c']; 
 

 
function processAsync(val) { 
 
    return new Promise(function(res, rej) { 
 
    console.log("Starting:", val); 
 
    setTimeout(function() { 
 
     console.log("Done:", val); 
 
     res(); 
 
    }, 1000); 
 
    }); 
 
} 
 

 
arr.reduce(function(promise, i) { 
 
    return promise.then(processAsync.bind(null, i)); 
 
}, Promise.resolve());

+0

Я думаю, что это лучшее решение, если OP еще не использует 'async'. – sdgluck

+0

На самом деле я использовал async.но это, безусловно, возможный ответ. Спасибо, в любом случае. – yaoxing

0
var array = ['a', 'b', 'c'],i = 0; 
var A = function(p){ 
    //some code 
    $.ajax({ 
     success:function(){ 
      try{ 
       A(item[++i]); 
      }catch{ 
       return; 
      } 
     } 
    }); 
} 

Are вы имеете в виду это

+0

это близко, но я на стороне сервера с nodejs. во всяком случае, я получил ответ выше. Спасибо за помощь. – yaoxing

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