Я могу добавить что-то вроде new Promise(resolve => resolve(a))
в массив Promise.all
, но это выглядит уродливо. Есть ли лучший способ передать данные в таких случаях?
Да: Использовать then
. Если у вас уже есть обещание, использование new Promise
не требуется. then
создает обещание, ожидающее разрешения того, на которое вы его вызвали, а затем получает разрешение на то, что вы возвращаете из обратного вызова then
, или отклоняется, если вы выбрали исключение. Одним из ключей обещаний является использование then
(и catch
) преобразует вещи на каждое звено в цепочке.
В этом конкретном случае вы должны использовать then
по первоначальному обещанию и использовать его обратный вызов, чтобы преобразовать результат с помощью a
(хотя, если вы хотите подождать, пока все будет готово, вы тоже можете это сделать;).
Боковой примечание: new Promise
линии в начале кода вашего вопроса не должна быть там, вы не возвращение обещание из посыла исполнителя (обратного вызова вы передаете new Promise
).
Пример:
const a = "some string";
Promise.all([
getPromise("one").then(result => result + " - " + a), // ***
getPromise("two")
])
.then(results => {
console.log(results);
});
function getPromise(str) {
// (Could use Promise.resolve here; emphasizing asynchronousness)
return new Promise(resolve => {
setTimeout(() => {
resolve(str);
}, 250);
});
}
С другой стороны, если вы действительно хотите использовать только a
, когда все обещания вы проходящими в Promise.all
решили, вы можете сделать это, тоже:
const a = "some string";
Promise.all([
getPromise("one"),
getPromise("two")
])
.then(([result1, result2]) => {
return [result1 + " - " + a, result2]; // ***
})
.then(results => {
console.log(results);
});
function getPromise(str) {
// (Could use Promise.resolve here; emphasizing asynchronousness)
return new Promise(resolve => {
setTimeout(() => {
resolve(str);
}, 250);
});
}
Можете ли вы уточнить, чего вы хотите достичь? Возможно, [mcve] с запущенным примером не использует 'a' и (как вы уже делали выше) комментарий, показывающий, где вы хотите, и что вы хотите с ним делать? –