2016-09-12 2 views
5

Я пытаюсь обернуть голову вокруг объекта обещания в javascript.Так вот у меня есть этот маленький кусок кода. У меня есть объект обещания и два console.log() по обе стороны объекта обещания. Я думал, что это будет печататьпонимание объекта обещания javascript

Hi

Там

Зами

но напечатанное

HI 

zami 

there 

Почему это так. У меня есть понимание того, как работает обещание, но я понимаю, как работает асинхронный обратный вызов в javascript. Может ли кто-нибудь пролить свет на эту тему?

console.log('hi'); 
var myPromise = new Promise(function (resolve, reject) { 
    if (true) { 
     resolve('There!'); 
    } else { 
     reject('Aww, didn\'t work.'); 
    } 
}); 

myPromise.then(function (result) { 
    // Resolve callback. 
    console.log(result); 
}, function (result) { 
    // Reject callback. 
    console.error(result); 
}); 
console.log('zami'); 

ответ

8

исполнение Promise является асинхронным, что означает, что он выполняется, но программа не будет ждать, пока она не будет закончена, чтобы продолжить с остальной частью коды.

В принципе, ваш код делает следующее:

  1. Log 'Привет'
  2. Создать обещание
  3. Execute Обещания
  4. Журнал 'З'
  5. Promise решен и журналов 'Там'.

Если вы хотите, чтобы напечатать «Привет, З», вы должны

myPromise.then(function (result) { 
    // Resolve callback. 
    console.log(result); 
    console.log('zami'); 
}, function (result) { 
    // Reject callback. 
    console.error(result); 
}); 
+0

поэтому он асинхронный, как и другие веб-apis, такие как setTimeout, вызов ajax и т. Д. Любой код внутри pormise-объекта будет асинхронным? –

+0

Да, обещает функцию очень похоже на setTimeout. Вы действительно можете сделать обещания от setTimeout, как показано здесь http://stackoverflow.com/questions/34255351/is-there-a-version-of-settimeout-that-returns-an-es6-promise –

+0

в некотором примере я вижу писателей написал ajax-код внутри объекта prom.AJAX по умолчанию асинхронный. Почему он используется внутри обещаний? –

2

Даже если вы решённый обещанными синхронно, обработчики вы передаете в then дозвонились асинхронно. Это в соответствии с defined specification:

onFulfilled и onRejected выполнить асинхронно, после поворота цикла обработки событий, в котором затем вызывается, и с новым стеком

1

Если вы хотите знать, и как он работает вы можете прочитать его here. Он показывает пример того, как реализовать обещание, чтобы вы могли лучше понять объект.

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