2017-01-03 2 views
9

Как вы цепляетесь за сценарий вроде этого?Цепочные обещания с обещаниями внутри тогда()

api - функция, которая возвращает обещание после запроса http. аутентификации это функция, которая возвращает обещание после апи реагировать, если решает апи вызывается во второй раз, если не AUTH бракованных.

Я пробовал это, но не только возвращаюсь к обратному аду, это не работает.

function api(query) { 
    return new Promise(function(resolve, reject) { 
    //DO SOME STUFF AND SOMETIMES resolves... 
    }) 
} 

function auth() { 
    return new Promise(function(resolve, reject) { 
    api("/foo").then(function(asset1) { 
     api("/bar").then(function(asset2) { 
      resolve(asset2); 
     }).catch(function() { 
      reject(); 
     }) 
    }).catch(function(error) { 
     reject(); 
    }) 

    }) 
} 
+0

Может '/ Foo' и'/bar' можно назвать одновременно или же '/ bar' полагаться на результат'/Foo'? Похоже, что 'asset1' никогда не используется.' – styfle

ответ

5

Насколько я понимаю, что вы пытаетесь сделать, следующий код будет также решить с asset2. Кроме того, я предполагаю, что функция api выполняет http-запрос, чтобы вы могли использовать request-promise lib вместо преобразования обратного вызова api с new Promise.

function api(query) { 
    return new Promise(function(resolve, reject) { 
    //DO SOME STUFF AND SOMETIMES resolves... 
    }) 
} 

function auth() { 
    return api("/foo") 
    .then(() => api("/bar")) 
} 

С этим абонентом будет делать что-то вроде:

auth() 
.then(asset2 => ...) 
.catch(err => ...) 

Если порядок вызова api не важно, как @styfle отметил в комментарии, вы могли бы написать его с помощью Promise.all

function auth() { 
    return Promise.all([ 
    api("/foo"), 
    api("/bar") 
    ]) 
} 
4

Я думаю, это должно помочь вам.

Просто наблюдение: метод then всегда возвращает обещание, основанное на предыдущем обещании. Если предыдущее обещание будет разрешено, оно передаст разрешенное значение к следующему обещанию. В противном случае он отправит ошибку в метод catch.

function auth() { 
    /* 
    Since `then` already returns a new Promise, 
    you don't need to create a new Promise. 
    */ 
    return api('/foo').then(function (asset1) { 
    return api('/bar') 
    }) 
} 

/* 
    So you can call auth: 
*/ 

auth().then(function (asset2) { 
    console.log('This is my asset2:', asset2) 
}).catch(function (error) { 
    console.error('Error', error) 
}) 
2

из Promises standard:

Если х обещание, принять свое состояние [3,4]: Если х находится на рассмотрении, обещание должно оставаться в ожидании, пока х не будет выполнено или отклонено. Если/когда выполняется x, выполняйте обещание с одинаковым значением. Если/когда x отклонено, отклоните обещание по той же причине.

Следующий пример печатает 'finalVal':

let resolveP1 = null; 

let p1 = new Promise(function(resolve, reject) { 
    resolveP1 = resolve; 
}); 

let p2 = new Promise(function(resolve, reject) { 
    resolve(p1); 
}); 

let p3 = p2.then(function(finalVal) { 
    console.log(finalVal); 
}); 

resolveP1('finalVal') 
Смежные вопросы