Я следую спецификации здесь и не уверен, позволяет ли она вызывать onFulfilled с несколькими аргументами. Например:
promise = new Promise(function(onFulfilled, onRejected){
onFulfilled('arg1', 'arg2');
})
так что мой код:
promise.then(function(arg1, arg2){
// ....
});
получил бы оба arg1
и arg2
?
Меня не волнует, как это работает какая-либо конкретная реализация обещаний, я хочу внимательно следить за спецификацией обещаний w3c.
javascript
promise
badunk
источник
источник
Ответы:
Нет, только первый параметр будет рассматриваться как значение разрешения в конструкторе обещания. Вы можете разрешить с помощью составного значения, такого как объект или массив.
Вот где я считаю, что вы ошибаетесь. Спецификация разработана так, чтобы быть минимальной и рассчитана на взаимодействие между библиотеками обещаний. Идея состоит в том, чтобы иметь подмножество, которое, например, фьючерсы DOM могут надежно использовать, а библиотеки - потреблять. Реализации обещаний
.spread
некоторое время делают то, о чем вы просите . Например:С Bluebird . Одно из решений, если вам нужна эта функция, - это полифил.
Это позволяет вам:
С родными обещаниями спокойно возиться . Или используйте распространение, которое сейчас (2018) обычное дело в браузерах:
Или с ожиданием:
источник
.spread
например Bluebird - причина, по которой этого нет в спецификации, заключается в том, что сохранение минимальной спецификации действительно имеет большое значение для обеспечения взаимодействия между кодом и библиотеками.Promise.all
массив перед применением функции, а не просто использовать.then
его для обработки некоторых библиотек сахара. Это не обязательно, но мило.return Promise.all(args).then(function(args){return fn.apply(this, args);})
spread
это временная мера. ES6 вводит деструктуризацию и оператор остатка / спреда, которые полностью устраняют необходимостьspread
..then(([a, b, c]) => {})
Вы можете использовать деструктуризацию E6:
Деструктуризация объекта:
Деструктуризация массива:
источник
Значение выполнения обещания соответствует возвращаемому значению функции, а причина отклонения обещания соответствует выброшенному исключению функции. Функции не могут возвращать несколько значений, поэтому обещания не должны иметь более одного значения выполнения.
источник
Насколько я могу судить, читая спецификацию ES6 Promise и стандартную спецификацию обещания, нет предложения, препятствующего реализации в обработке этого случая, однако оно не реализовано в следующих библиотеках:
Я предполагаю, что причина, по которой они опускают multi arg resolves, состоит в том, чтобы сделать порядок изменения более лаконичным (то есть, поскольку вы можете вернуть только одно значение в функции, это сделает поток управления менее интуитивным) Пример:
источник
return Promise.of(x, y)
вместо скалярного значения изthen
обратного вызова.Вот решение CoffeeScript.
Я искал то же решение и нашел в этом ответе что-то очень интересное: отклонение обещаний с несколькими аргументами (например, $ http) в AngularJS
ответ этого парня Флориана
И использовать это:
источник
->
быть=>
?Отличный вопрос и отличный ответ Бенджамина, Криса и др. - большое спасибо!
Я использую это в своем проекте и создал модуль на основе кода Бенджамина Грюнвальда . Это доступно на npmjs:
Затем в вашем коде сделайте
Если вы используете такую библиотеку, как
any-promise
Может быть, другие тоже найдут это полезным!
источник
Назначение декструктуризации в ES6 может помочь здесь.
источник
Поскольку функции в Javascript могут быть вызваны с любым количеством аргументов, а документ не накладывает никаких ограничений на
onFulfilled()
аргументы метода, кроме приведенного ниже предложения, я думаю, что вы можете передать несколько аргументовonFulfilled()
методу, если значение обещания равно первый аргумент.источник
Чтобы процитировать статью ниже, «then» принимает два аргумента: обратный вызов для случая успеха и еще один для случая отказа. Оба аргумента являются необязательными, поэтому вы можете добавить обратный вызов только для случая успеха или отказа ».
Обычно я просматриваю эту страницу, чтобы найти ответы на основные вопросы об обещаниях, дайте мне знать, если я ошибаюсь
http://www.html5rocks.com/en/tutorials/es6/promises/
источник
new Promise
имеет синтаксис,function(resolve, error)
ноthen
есть синтаксис.then(function(arg) {
.then(function(/*resolve args*/){/*resolve handler*/}, function(/*reject args*/){/*reject handler*/})