2017-01-27 2 views
1

У меня есть два запроса и некоторая функция, которая будет вызвана между ними. Поток заключается в том, что, когда первое обещание называется и закончено, независимо от того, какой результат (успех или неудача), должна быть вызвана некоторая функция, не связанная с обещанием, и только после того, как мы должны назвать второе обещание. Так вот как я это сделал, что не похоже на хорошее решение.Promise - вызов функции между двумя обещаниями

funtionReturnsPromise() 
    .then(()=>{}) 
    .catch(()=>{}) 
    .then(()=>{ 
     nonPromiseRelatedFuntion() 
    }) 
    .then(()=>{ 
     return funtionReturnsPromise2() 
    }) 
+0

Все в 'then()' является обещанием. Вы либо должны поставить свой код до или после кода обещания. Вы не можете установить это между тем, если хотите, чтобы он не был связан с обещанием. – pixelarbeit

+0

и почему, на ваш взгляд, это нехорошее решение? – Sirko

+0

Я не уверен, но не можете ли вы использовать обратный вызов в последней строке первого обещания? – Raimonds

ответ

0

Поскольку желаемый поток:

Promise > Function > Promise

, на котором функция выполняется независимо от результата первого обещания, вы можете просто сделать что-то вроде:

function secondFunction(outcome) { 
 
    // do stuff 
 
    
 
    return funtionReturnsPromise2() 
 
} 
 

 
functionReturnsPromise().then(secondFunction).catch(secondFunction)

Теперь, по другой теме, я бы не назвал вторую функцию «несвязанной», поскольку она ясно, согласно вашему объяснению, должна быть вызвана после того, как будет выполнено первое обещание.

0

Предполагая nonPromiseRelatedFuntion является синхронизация и вы не заинтересованы в обратном значении functionReturnsPromise

functionReturnsPromise() 
.then(
    // no matter what happens, the function is invoked 
() => { nonPromiseRelatedFunction() }, 
    error => { 
    nonPromiseRelatedFunction() 
    // do error handling from functionReturnsPromise 
    } 
) 
.then(() => functionReturnsPromise2() } 
.catch(console.error) 

Если вам нужно значение:

functionReturnsPromise() 
.then(
    value => { 
    nonPromiseRelatedFunction() 
    return functionReturnsPromise2(value) 
    }, 
    error => { 
    nonPromiseRelatedFunction() 
    // do error handling from functionReturnsPromise 
    } 
) 
.catch(console.error) // error handling from functionReturnsPromise2 
0

Как и другие ответы я предполагаю, что

  • nonPromiseRelatedFunction является синхронным
  • вы действительно не заботятся ни о каком возвращении значения
  • nonPromiseRelatedFunction и funtionReturnsPromise2 должны быть выполнены при любых обстоятельствах

Начитавшись ВСЕ комментарии к этому вопросу, я вижу выше не предположение после того, как все

Самое простое решение, чтобы избавиться от первого .then

funtionReturnsPromise() 
    .catch(()=>{}) 
    .then(()=>{ 
     nonPromiseRelatedFuntion() 
    }) 
    .then(()=>{ 
     return funtionReturnsPromise2() 
    }) 

Примечание: такой код может быть написан

funtionReturnsPromise() 
    .catch(()=>{}) 
    .then(nonPromiseRelatedFuntion) 
    .then(funtionReturnsPromise2) 

уверен, что последние две функции будут получать аргументы, но если код в этих функциях игнорирует аргументы в любом случае, то их не будет проблемой

Смежные вопросы