2014-08-28 4 views
0

Вот код:Как я могу выполнить 3 асинхронные функции в порядке?

adjust_geo = function(callback){Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
      "sluice", 
      "prot-spec v1.0", 
      "request", 
      "zoom" 
      ], 
      "ingests": { 
      "lat": stickie.latitude, 
      "lon": stickie.longitude, 
      "level": stickie.zoom_level 
      } 
     }); 
     Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
      "sluice", 
      "prot-spec v1.0", 
      "request", 
      "set-time" 
      ], 
      "ingests": { 
      "time": stickie.start, 
      "rate": 2.0, 
      "pause": false 
      } 
     }); 
     callback(); 
     }   

     var remove_stickies = function(callback){  
      Plasma.Hose('edge-to-sluice').Deposit({ descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'], ingests : {} 
     }); 
     callback(); 
     } 


     deposit_fluoros = function(){ 
     console.log(stickie.fluoroscopes); 
     L = JSON.parse(stickie.fluoroscopes); 
     console.log(L); 
     for (var i = 1; i<L.length;i++){ 
       console.log(L[i]);     
       Plasma.Hose('tcp://localhost/edge-to-sluice') 
         .Deposit({ 
          "descrips": [ 
          "sluice", 
          "prot-spec v1.0", 
          "request", 
          "new-fluoro-instance"], 
          "ingests":L[i] 
         }); 
       }; 
      } 
      } 
    adjust_geo(remove_stickies(deposit_fluoros())); 

как вы можете видеть на последней строке, я пытаюсь выполнить три asnychronous функции в порядке. Однако прямо сейчас он жалуется, что callback() в строке 34 не определен. TypeError: undefined не является функцией. Это странно, потому что, похоже, он не заботится об одном в adjust_geo?

+2

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

+1

Причина, по которой вы получаете ошибку на 34, состоит в том, что callback() вызывается вне функции remove_stickies. –

+0

Каков желаемый порядок выполнения 'adjust_geo',' remove_stickies' и 'deposit_fluoros'? – Igor

ответ

0

Изменение вы последняя линия читать

adjust_geo(remove_stickies(deposit_fluoros)); 

То, как вы делаете это сейчас делаете это, вы передаете в результате deposit_fluoros в отличие от передачи ссылки на функцию.

+0

это не будет передавать обратный вызов 'adjust_geo' – Igor

0

Удалены все другие объекты, просто обратные вызовы. Верните свои объекты, и это сработает. Ключевое правило, когда вы возвращаете или вызываете обратный вызов, обязательно верните его как функцию.

var adjust_geo = function (callback) { 

    callback(); 
    console.log('adjust_geo'); 
} 
// wrap the result of first call into a function and return it 
var remove_stickies = function (callback) { 
    return function() { 
     callback() 
     console.log('remove_stickies'); 
    }; 
} 


var deposit_fluoros = function() { 
    console.log('deposit_fluoros') 
}; 

adjust_geo(remove_stickies(deposit_fluoros)); 

Выход:

"deposit_fluoros" 
"remove_stickies" 
"adjust_geo" 
+0

hmm это не дает никаких неопределенных ошибок. но все же кажется, что он идет в порядке remove_stickies, deposit_fluoros, adjust_geo. Может быть, я должен использовать обещания? – user3727514

+0

Обновлен мой ответ: если вы добавите свой код везде, где есть инструкции console.log, он будет в порядке. – Abhi

+0

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

1

Существуют проблемы с вашей последней строкой (вы должны передать функцию обратного вызова, а не делать вызов функции), и у вас есть пропуск обратного вызова во всех функции или проверить в коде, если обратный вызов был принято:

adjust_geo(
    function(){ 
    remove_stickies(
     deposit_fluoros 
    ) 
    }); 

Это будет вызывать adjust_geo с обратным вызовом, который будет вызывать remove_stickies с обратным вызовом, который будет звонить deposit_fluoros.

Если Plasma.Hose('...').Deposit выглядит Plasma.Hose('...').Deposit(data, doneCallback) вы можете обновить свой код для запуска функции в порядке перемещения следующей функции вызовов в doneCallback:

adjust_geo = function(callback) { 
    Plasma.Hose('edge-to-sluice').Deposit({ 
      "descrips": [ 
       "sluice", 
       "prot-spec v1.0", 
       "request", 
       "zoom" 
      ], 
      "ingests": { 
       "lat": stickie.latitude, 
       "lon": stickie.longitude, 
       "level": stickie.zoom_level 
      } 
     }, 
     function() { 
      Plasma.Hose('edge-to-sluice').Deposit({ 
       "descrips": [ 
        "sluice", 
        "prot-spec v1.0", 
        "request", 
        "set-time" 
       ], 
       "ingests": { 
        "time": stickie.start, 
        "rate": 2.0, 
        "pause": false 
       } 
      }, callback) 
     } 
    ); 
} 

var remove_stickies = function(callback) { 
    Plasma.Hose('edge-to-sluice').Deposit({ 
     descrips: ['sluice', 'prot-spec v1.0', 'request', 'remove-all-fluoro'], 
     ingests: {} 
    }, callback); 
} 


deposit_fluoros = function() { 
    console.log(stickie.fluoroscopes); 
    L = JSON.parse(stickie.fluoroscopes); 
    console.log(L); 
    for (var i = 1; i < L.length; i++) { 
     console.log(L[i]); 
     Plasma.Hose('tcp://localhost/edge-to-sluice') 
      .Deposit({ 
       "descrips": [ 
        "sluice", 
        "prot-spec v1.0", 
        "request", 
        "new-fluoro-instance" 
       ], 
       "ingests": L[i] 
      }); 
    }; 
} 
} 

adjust_geo(
    function() { 
     remove_stickies(
      deposit_fluoros 
     ) 
    }); 
+0

, это имеет смысл для меня, и теперь консоль регистрирует параметры настройки_geo, remove_stickies, deposit_fluoros в правильном порядке. Однако сами функции по-прежнему выполняются в неправильном порядке. Возможно ли, что обратные вызовы внутри функций выполняются до того, как заканчивается этот основной блок кода (Plasma.Hose. ....)? – user3727514

+0

На самом деле все функции в этом вопросе ** не ** асинхронны. Я полагаю, что «Plasma.Hose (« ... »). Депозит« асинхронный », и в этом случае вам нужно передать« обратный вызов »внутри этих функций. – VitaliyG