2016-05-21 6 views
3

Когда мы создаем функцию, которая возвращает обещание, как это:Можно ли задержать отсрочку обещания?

function getAsyncResult() { 

    // synchronous code 1 

    return new Promise(function (resolve, reject) { 

     // synchronous code 2 

     // asynchronous code 

    }); 
} 

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

Другими словами, возможно ли, что может быть задержка между new Promise(...) и вызовом ее функции обратного вызова?

Чтобы перефразировать его снова, возможно ли, что synchronous code 2 выполняется с задержкой, а не сразу после synchronous code 1?

P.S. Меня это больше интересует в отношении ES6 Promise и Bluebird, хотя было бы неплохо узнать, делают ли другие крупные библиотеки по-другому.

+0

__Очистить то, что вы просите __... Разделите пример, чтобы выразить то, что вы просите ... – Rayon

+0

Я добавил еще одно разъяснение. –

+0

'Delay'? Вы имеете в виду, когда обещание исполнено? – Rayon

ответ

0

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

Давайте посмотрим на этот

return new Promise(function (resolve, reject) { 

     // synchronous code 2 

     // asynchronous code 

    }); 

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

Это может быть вход пользователя, запрос ajax и т. Д., Который вы действительно не знаете, когда это произойдет.

Выполнение кода внутри вашего конструктора обещаний происходит сразу же, когда вы можете начать свой асинхронный процесс (synchronous code 2), прежде чем перейти к любой другой строке кода.

Если вам действительно нужно отделить линейное исполнение synchronous code 2 и asynchronous code, возможно, вы можете поместить его в функцию setTimeout. Таким образом, он выполняется, когда браузер получает следующее пространство для передышки. Но такая практика немного искажена перед концепцией Promise.

+0

'Выполнение кода внутри вашего конструктора обещаний происходит сразу ...' - этого абзаца было бы достаточно, а остальное - я не спрашивал. Было бы неплохо узнать, следуют ли все основные библиотеки обещаний. –

+1

Ответ не только для вас. Он призван помочь всем остальным, кто попадает на этот вопрос. –

+0

Молодцы! :) Я буду ждать, пока другие скажут, прежде чем принимать ответ;) –

2

В соответствии с ES6 spec то, что он называет «исполнителем» (обратный вызов, переданный конструктору), выполняется немедленно. Поэтому реализация, которая не ведет себя так, не будет соответствовать, и вы можете зависеть от нее.

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

Другие реализации могут различаться, а некоторые могут даже не создавать конструктор обещаний в стиле ES6, выбирая какие-то другие обещания.

+0

Знаете ли вы, соответствуют ли основные библиотеки, такие как Bluebird, When, Q? –

0

Абсолютно без задержки произойдет: код будет выполнен в том же стеке, синхронно.

В качестве доказательства, вы можете запустить этот фрагмент:

console.log('sync code before promise'); 

new Promise(function (resolve, reject) { 
    console.log('sync code in promise'); 
}); 

console.log('sync code after promise'); 

Результата является прежде -> в -> после

1

С ES6/совместимой Promise, synchronous code 1 и synchronous code 2 будут (за исключение неперехваченной ошибки) выполнить в этом порядке, в том же самом случае поворота. Тем не менее, есть разница:

  • синхронный код 1: неперехваченное ошибка выбросит (консоль) обычным способом.
  • синхронный код 2: Непонятная ошибка вызовет отказ Обещания.

asynchronous code действительно не существует, по крайней мере, на этом уровне; только внутренние функции могут выполняться позже. Вы можете вызвать функцию, которая возвращает обещание. Такое обещание, p, может быть использовано для разрешения/отклонения внешнего обещания (построенного) без использования .then(), используя синтаксис resolve(p), таким же образом вы бы напили resolve(value).

С resolve(p) заявления на месте, если p был отказаться, то внешний Promise также отказаться, даже если его собственный показал reject метод не вызывается явно кодом пользователя.

+1

Правильно, обработка исключений - основное отличие здесь.Чтобы перефразировать его: в случае ошибки ** код синхронизации 1 ** собирается генерировать нормальное синхронное исключение, которое немедленно прекращает выполнение функции, тогда как ** код синхронизации 2 ** будет инициировать отклонение, которое может быть обнаружено асинхронно последующими обработчиками захвата в цепочке «Promise». – rand

+0

@ Да, хорошо, хорошо. –

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