2017-01-03 125 views
9

你如何链接在这样的情况?链接承诺内的承诺然后()

api是在http请求后返回promise的函数。 AUTH的是,经过API响应返回一个承诺的功能,如果解决API被称为第二次,如果不是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

如果x是一个承诺,通过其状态[3.4]: 如果x未决,承诺必须保持等待状态,直到x被满足或拒绝。 如果/当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')