Ну, в случае локальной переменной ясно, что это означает «раньше», поскольку поток программы между объявлением (в методе) и ссылкой является последовательным. В случае, если поля, объявленные вне компилятора метода, никогда не знают, какой код будет использоваться, когда он не сможет сгенерировать ошибку, поскольку, возможно, какой-либо другой метод будет инициализировать поле до его использования.
В отличие от обоих ответов в комментариях - есть разница.
Хотя
Promise.resolve(x);
в основном совпадает с
new Promise(function(r){ r(x); });
, там является тонкостью.
Функции возврата обещаний обычно должны иметь гарантию, что они не должны бросать синхронно, так как они могут асинхронно бросать. Чтобы предотвратить неожиданные результаты и условия гонки - броски обычно преобразуются в возвращенные отклонения.
Учитывая это - когда спецификация была создана, конструктор обещаний выбрасывает сейф.
someObject
есть undefined
? Bluebird увидев это, и Петка добавил Promise.method
, чтобы решить эту проблему, чтобы вы могли продолжать использовать возвращаемые значения. Таким образом, правильный и простой способ написать это в Bluebird на самом деле не так: это:
var someFunction = Promise.method(function someFunction(someObject){
someObject.resolved = true;
return someObject;
});
Promise.method будет конвертировать броски для отклонения и возврата к разрешению для вас. Это самый безопасный способ бросить это, и он ассимилирует then
ables через возвращаемые значения, чтобы он работал, даже если someObject
на самом деле является обещанием.
В общем случае Promise.resolve
используется для сдачи объектов и иностранных обещаний (thenables) для обещаний. Это его прецедент.
Promise.resolve()
является анти-шаблоном? – Ashley Coolman 28 January 2016 в 13:50Promise.resolve()
новый экземплярPromise
так же, как с помощьюnew
? Если нет,return Promise.resolve(yourCode)
будет быстрее и избежать синхронных бросков. – Steven Vachon 12 February 2016 в 04:30Promise.coroutine
, что еще более полезно. – Benjamin Gruenbaum 24 August 2016 в 19:51