2017-01-25 2 views
0

Как передать дополнительные аргументы в следующий «шаг» обещания?JavaScript-обещания: обычный способ передачи аргументов

new Promise((resolve, reject) => { 
    const a = // do stuff and return a string 
    return Promise.all([ 
    // execute another promise, 
    // execute yet another promise 
    ]) 
}) 
.then(([resultFromPromise_1, resultFromPromise_2]) => { 
    // how do i pass `const a` here? 
}) 

я могу добавить что-то вроде new Promise(resolve => resolve(a)) в Promise.all массив, но это выглядит некрасиво. Есть ли лучший способ передать данные в таких случаях?

+1

Можете ли вы уточнить, чего вы хотите достичь? Возможно, [mcve] с запущенным примером не использует 'a' и (как вы уже делали выше) комментарий, показывающий, где вы хотите, и что вы хотите с ним делать? –

ответ

0

Я могу добавить что-то вроде new Promise(resolve => resolve(a)) в массив Promise.all, но это выглядит уродливо. Есть ли лучший способ передать данные в таких случаях?

Да: Использовать then. Если у вас уже есть обещание, использование new Promise не требуется. then создает обещание, ожидающее разрешения того, на которое вы его вызвали, а затем получает разрешение на то, что вы возвращаете из обратного вызова then, или отклоняется, если вы выбрали исключение. Одним из ключей обещаний является использование thencatch) преобразует вещи на каждое звено в цепочке.

В этом конкретном случае вы должны использовать 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); 
 
    }); 
 
}

+0

Downvoter: Что, собственно, не полезно в этом ответе? –

1

Прежде всего, ваше первое обещание имеет ошибку, вы не разрешаете его. Вы должны сделать что-то вроде этого:

new Promise((resolve, reject) => { 
    const a = 1; 
    resolve(Promise.all([ 
    ...  
])) 
}) 

А что касается вашего вопроса, то вместо new Promise(resolve => resolve(a)) вы можете просто пройти a непосредственно к all массива. т.е.:

new Promise((resolve, reject) => { 
    const a = 1; 
    resolve(Promise.all([ 
    Promise.resolve("a"), 
    Promise.resolve("b"), 
    a, 
    ])) 
}) 
.then(([resultFromPromise_1, resultFromPromise_2, a]) => { 
    console.log(a); 
}) 
+0

'new Promise (solve => {resolve (x);})' - это долгий путь для написания 'Promise.resolve (x)'. И в этом случае 'x' является' Promise.all (...) ', который уже возвращает обещание, поэтому он совершенно бессмыслен. :-) –

+0

Интересная идея передать 'a' в' Promise.all'. Если вы уже используете 'Promise.all', совсем не плохая идея! Но это не универсальное решение ... –

+0

Что значит «это не универсальный»? Передача значения непосредственно в массив 'all' является способом передачи более« аргументов »на« следующий шаг », это то, что было задано в этом вопросе. –