2016-11-15 9 views
0
getApplication(){ 
    function a() { 
     let time = +new Date(); 
     while (time + 10000 > +new Date()) { 
      console.log(1); 
     } 
    } 

    return (dispatch)=> { 
     httpUtil.GET(url).then(
      (data)=> { 
       console.log(data); 
      }, 
      (err)=> {}); 
     a(); 
    }; 
} 

В Redux действий асинхронизировать действий Творца, httpUtil.GET будет возвращать ответ API с веб-конца, однако, в моем тесте, он был блокирован функцией a, каждый раз httpUtil.GET вернулся после a excuted полностью.Почему функциональный блок обещает в Action-Action?

httpUitl основан на fetch.

Почему обещание было заблокировано функцией a?

ответ

0

Когда JavaScript Promise разрешает/отклоняет соответствующие обратные вызовы из .then()/.catch() добавляются в queue for the event loop, так же, как setTimeout, setInterval, или что-нибудь еще асинхронной в JavaScript.

Вещь, которая важна для реализации цикла событий, заключается в том, что она не запускает обработку сообщений с очереди до тех пор, пока стек не будет полностью очищен - что обычно не происходит до тех пор, пока самая внешняя функция, выполняемая в данный момент, не завершится. Потому что a() является синхронным, getApplication() не может вернуться, пока он не закончит, что означает, что все, что называется getApplication(), не может вернуться до , что заканчивается и так далее.

Таким образом, само обещание разрешается до a(), но механизм JavaScript не может выполнить ваш обратный вызов до тех пор, пока a() не завершится, и стек может очиститься.

Я бы посоветовал вам посмотреть разговор "What the heck is the event loop anyway?", если вы хотите узнать больше - это действительно поможет вам понять, как работает JavaScript под капотом.