2015-01-08 3 views
1

В чем разница между этими сценариями, когда дело доходит до стека вызовов?Promises vs function calls/setTimeOut

Сценарий 1:

function A(){//doStuff}; 
function B(){//doStuff}; 

Сценарий 2:

function A(){//doStuff}; 
window.setTimeOut(function B(){//doStuff}, 5000); 

Сценарий 3:

function A(){//doStuff}.then(function B(){//doStuff}); 

Я обсуждал баг с кем-то, и они предположили, что я просто добавить setTimeOut ко второй функции и дождитесь, если она срабатывает. Я использую библиотеку обещаний A +, и мне интересно, можно ли просто приложить обещание к первой функции и запустить вторую, когда будет выполнена функция A.

Также я не уверен, что основное отличие setTimeOut и обещания будет от первого сценария. Я знаю, что обещания и тайм-ауты перемещают функции до конца стека вызовов, но я не уверен, что произойдет после этого момента и как это будет отличаться от сценария 1. Любая информация будет оценена.

ответ

2

Мне интересно, можно ли просто приложить обещание к первой функции и запустить второй, когда функция A будет выполнена.

Обещает работать, подключая возвращаемые значения функций. Функция возвращает обещание, которое, в свою очередь, можно подключить. JavaScript не обнаруживает возможности обнаружить, когда функция завершила выполнение. Так, например, если у вас есть API, который делает:

api.someAsyncThing(); // does not return a promise 

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

Также я не уверен, что основное отличие setTimeOut и обещания будет от первого сценария.

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

+0

как B "начать работать до того, как A закончен", если JS однопоточный? – dandavis

+0

@ dandavis Например, функция A() {setTimeout (function() {alert ("HI");}, 6000); } 'функция вернулась, но это вызовет побочные эффекты на 6 секунд дольше. –

+0

Могу ли я назвать обещание функции, которая возвращает значение? Даже если он просто возвращает true, например. –