2015-04-05 6 views
1

Я наблюдаю отсрочку полнотекстовых уведомлений в обещаниях Firefox. Следующее утверждение терпит неудачу, потому что onFullfilled() называется слишком поздним *.Когда вызываются крючки Promise.then()?

var resolved = false; 
function onFullfilled() { 
    resolved = true; 
    log("Completed"); 
} 
Promise.resolve(true).then(onFullfilled); 
assert(resolved, "Promise completed promise should call resolution hook immediately."); 

Когда именно onFullfilled() гарантированно будет вызываться по соглашению Promise?

* В моем случае сообщение об ошибке «Завершено» появляется после отказа утверждения отчета об аналитическом представлении.

ответ

3

крючки разрешения Promise являются всегда называется после все синхронизации выполняется код. Это по дизайну - и сделано для предотвращения условий гонки.

Поскольку обещания иногда разрешаются асинхронно, мандаты спецификации всегда разрешены асинхронно, поэтому выполняется тот же путь кода. Обещания охраняют вас against Zalgo.

Это specified here:

onFulfilled или onRejected не должен вызываться до тех пор, стек контекста выполнения содержит только код платформы.

Множество тестовых рамок, а именно тестирование поддержки Mocha, обещает прямо с синтаксисом обещания, возвращая обещание.

it("does something", function(){ 
    return aPromise; // if aPromise resolves the test passes 
}) 
-2

Вы должны всегда давать функцию «тогда». Таким образом, вы должны использовать «onFullfilled()» вместо «onFullfilled» в качестве параметра «then».

Так оно и должно быть, как:

Promise.resolve (правда) .Затем (onFullfilled());

+0

Нет, '.then (onFulfilled)' правильный. 'onFulfilled' - это функция. 'onFulfilled()' - вызов функции. –

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