Я использую ES6 Promise.
Обычно Обещание конструируется и используется следующим образом.
new Promise(function(resolve, reject){
if (someCondition){
resolve();
} else {
reject();
}
});
Но я делал что-то похожее на приведенное ниже, чтобы проявить решимость снаружи ради гибкости.
var outsideResolve;
var outsideReject;
new Promise(function(resolve, reject) {
outsideResolve = resolve;
outsideReject = reject;
});
И позже
onClick = function(){
outsideResolve();
}
Это прекрасно работает, но есть ли более простой способ сделать это? Если нет, то это хорошая практика?
javascript
promise
es6-promise
Морио
источник
источник
Promise
должен выполняться синхронно, чтобы можно было «экспортировать» две функции.Ответы:
Нет, другого способа сделать это нет - единственное, что я могу сказать, это то, что этот вариант использования не очень распространен. Как сказал Феликс в комментарии - то, что вы делаете, будет работать последовательно.
Стоит отметить, что причина, по которой конструктор обещания ведет себя таким образом, заключается в безопасности выброса - если исключение, которое вы не ожидали, произойдет, когда ваш код выполняется внутри конструктора обещания, оно превратится в отклонение, эта форма безопасности броска - преобразование брошенных ошибок в отклонение важно и помогает поддерживать предсказуемый код.
По этой причине безопасности броска конструктор обещания был выбран из отложенных (которые являются альтернативным способом построения обещания, позволяющим делать то, что вы делаете), - что касается передовых методов - я бы пропустил элемент и вместо этого использовал конструктор обещания:
По этой причине - всякий раз, когда вы можете использовать конструктор обещаний вместо экспорта функций - я рекомендую вам использовать его. Всякий раз, когда вы можете избежать обоих - избегайте обоих и цепей.
Обратите внимание, что вы никогда не должны использовать конструктор обещания для таких вещей, как
if(condition)
первый пример:источник
Promise
цепочку? Например, в моем конкретном случае я нахожусь на сервере, ожидая ответа конкретного клиента (SYN-ACK - своего рода рукопожатие, чтобы убедиться, что клиент успешно обновил состояние).просто:
источник
promiseResolve()
. Семантика обещания состоит в том, что оно всегда возвращает значение. Кроме того, это функционально так же, как пост ОП, я не понимаю, какую проблему это решает многократно.promiseResolve()
, не будет генерировать исключение. Вы можете определить.catch
конструктор, и независимо от того, какой код его вызывает, конструктор.catch
будет вызван. Вот jsbin демонстрирующее , как это работает: jsbin.com/yicerewivo/edit?js,consoleНемного опоздал на вечеринку, но другой способ сделать это - использовать отложенный объект. По сути, у вас такое же количество шаблонов, но это удобно, если вы хотите передать их и, возможно, решить за пределами их определения.
Наивная реализация:
Версия ES5:
источник
resolve|reject
, назначены ли лексически или черезbind
. Это просто простая реализация отложенного объекта jQuery , существующего с версии 1.0 (ish). Это работает так же, как обещание, за исключением того, что нет безопасности броска. Весь вопрос в том, как сохранить несколько строк кода при создании обещаний.Deferred
рекомендуется?Решение, которое я предложил в 2015 году для моей платформы. Я назвал этот тип обещаний Задачей
источник
Мне понравился ответ @JonJaques, но я хотел сделать еще один шаг вперед.
Если вы связываете,
then
аcatch
затемDeferred
объект, то он полностью реализуетPromise
API, и вы можете рассматривать его как обещание,await
и так далее.источник
Вспомогательный метод уменьшит эти дополнительные издержки и даст вам то же чувство jQuery.
Использование будет
Что похоже на JQuery
Хотя, в случае использования этот простой, родной синтаксис хорош
источник
Я использую вспомогательную функцию для создания так называемого «плоского обещания» -
И я использую это так -
Смотрите полный рабочий пример -
Показать фрагмент кода
Редактировать: я создал пакет NPM под названием « плоское обещание», и код также доступен на GitHub .
источник
Вы можете обернуть Обещание в классе.
источник
Многие из ответов здесь аналогичны последнему примеру в этой статье . Я кэширование нескольких Обещания, а
resolve()
иreject()
функции могут быть назначены на любой переменной или свойства. В результате я могу сделать этот код немного более компактным:Вот упрощенный пример использования этой версии
defer()
для объединенияFontFace
загрузки Promise с другим асинхронным процессом:Обновление: 2 варианта, если вы хотите инкапсулировать объект:
и
источник
const result = await deferred.promise;
Принятый ответ неверен. Использовать область видимости и ссылки довольно просто, хотя это может разозлить пуристов Promise :
По сути, мы получаем ссылку на функцию разрешения при создании обещания и возвращаем его, чтобы его можно было установить извне.
Через секунду консоль выдаст:
источник
Да, ты можешь. Используя
CustomEvent
API для среды браузера. И использование проекта генератора событий в среде node.js. Поскольку фрагмент в вопросе относится к среде браузера, вот рабочий пример для того же.Надеюсь этот ответ полезен!
источник
Нашим решением было использовать замыкания для хранения функций разрешения / отклонения и дополнительно добавить функцию для расширения самого обещания.
Вот образец:
И используя это:
источник
promise.resolve_ex = _resolve; promise.reject_ex = _reject;
... все еще работает отлично.Я обнаружил, что пропускаю паттерн Deferred в некоторых случаях. Вы всегда можете создать один поверх Обещания ES6:
источник
Спасибо всем, кто разместил в этой теме. Я создал модуль, который включает в себя объект Defer (), описанный ранее, а также несколько других объектов, построенных на нем. Все они используют Обещания и аккуратный синтаксис обратного вызова Promise для реализации связи / обработки событий в программе.
Очередь: Очередь выполнения, основанная на цепочке Promise.
rp = require("repeatable-promise")
https://github.com/CABrouwers/repeatable-promise
источник
Я написал небольшую библиотеку для этого. https://www.npmjs.com/package/@inf3rno/promise.exposed
Я использовал метод завода подход других написал, но я перегрузил
then
,catch
,finally
методы, так что вы можете решить оригинальное обещание тем , как хорошо.Разрешение Обещания без исполнителя со стороны:
Гонки с setTimeout исполнителя снаружи:
Существует режим без конфликтов, если вы не хотите загрязнять глобальное пространство имен:
источник
Я сделал библиотеку под названием,
manual-promise
которая функционирует как замена дляPromise
. Ни один из других ответов здесь не будет работать как заменаPromise
, так как они используют прокси или оболочки.yarn add manual-promise
npn install manual-promise
https://github.com/zpxp/manual-promise#readme
источник
Как насчет создания функции, чтобы захватить отклонение и вернуть его?
источник
Я собрал суть, которая делает эту работу: https://gist.github.com/thiagoh/c24310b562d50a14f3e7602a82b4ef13
вот как вы должны его использовать:
источник
сначала включите --allow-natives-синтаксис в браузере или узле
источник
Просто еще одно решение для разрешения Promise извне
использование
источник