#javascript #es6-promise
#javascript #es6-обещание
Вопрос:
У меня есть функция, которая принимает входные данные, в соответствии с этими входными данными она либо вызовет одну из двух функций (обе возвращают обещание) Я хочу затем вызвать то же самое .then()
после того, как что бы из них ни произошло.
Я нашел Promise.any()
, но это не совсем то, что я хочу.
Для любознательных умов :
Я работаю над react-native
приложением и хочу либо открыть камеру, либо галерею, а затем обработать фотографию в then()
.
Как я могу это сделать?
Комментарии:
1.
Promise.finally()
2. К вашему сведению, было бы неплохо просто спросить «как я могу это сделать» вместо «каков наилучший способ сделать это», потому что первое требует ответственности, тогда как второе запрашивает мнения. Как правило, если вы спросите «как», никто не ответит наихудшим способом выполнения действий :).
3. Также было бы неплохо посмотреть, что вы пробовали и как организованы ваши функции, чтобы мы могли дать вам совет, который подходит для вашего сценария.
4. Это просто одна из тех ситуаций, когда вы упустили из виду, что обещания могут храниться в переменных?
foo().then(next)
может бытьlet p = foo(); p.then(next);
, что также означает, что это может бытьlet p = maybe ? foo() : bar(); p.then(next);
5. @Wyck, я думаю, ты прав, я только что попробовал, но не был уверен, что это «хороший способ» достижения этого.
Ответ №1:
function myFunction(input) {
const promise = input === X ? callOne() : callTwo();
return promise.then(handleEitherFunction);
}
Комментарии:
1. Это на самом деле то, что сработало для меня, так просто, спасибо
Ответ №2:
Возможно, я чего-то не понимаю, но я верю, что вы можете просто выполнить свое обещание:
new Promise(fulfill =&&t; {
if( ... someCondition ...){
fulfill(selectPhoto());
}
else {
fulfill(pickPhoto());
}
}).then(selectedPhoto =&&t; {
console.lo&(selectedPhoto);
});
Функции selectPhoto
и pickPhoto
обе возвращают обещания. Обещание будет выполнено по цепочке, и console.lo&
функция будет вызвана только после того, как обещание, переданное для выполнения, будет выполнено.
Ответ №3:
Вы можете передать функцию resolve содержащего обещание и вызвать ее для любого из обещаний внутри, вот так.
const OneForTwo = new Promise( (resolve,reject) =&&t; {
const openCamera = new Promise(() =&&t; { console.lo&('your camera code') }).then( resolve )
const openGallery = new Promise(() =&&t; { console.lo&('your &allery code') }).then( resolve )
}).then( value =&&t; console.lo&('i &ot resolved by any of those promises'))
Я не знаю, как вы разрешаете свои обещания, но вы понимаете идею, как только любое из этих двух обещаний разрешится, они вызовут «разрешение» контейнера, которое вызовет «then».
надеюсь, это то, что вы ищете.