簡體   English   中英

鏈接承諾與當然的承諾()

[英]Chaining promises with promises inside then()

你如何在這樣的場景中鏈接?

api是一個在http請求后返回promise的函數。 auth是一個函數,在api響應后返回一個promise,如果第二次調用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();
     })

   })
}

據我所知,您正在嘗試做什么,以下代碼也將解決asset2 除此之外,我猜api函數正在執行http請求,因此您可以使用request-promise lib而不是使用new Promise轉換回調api。

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")
  ])
}

來自Promises標准

如果x是一個promise,則采用其狀態[3.4]:如果x處於未決狀態,則promise必須保持掛起狀態,直到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')

我認為這應該對你有幫助。

只是一個觀察: 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)
})

更簡潔的方法:

return myFirstPromise.then( (returnFromFirst) => {
    //Do something
    return secondPromise();
}).then( (returnFromSecond) => {
    //Do something
    return thirdPromise();
}).then( (returnFromThird) => {
    //All Done
}).catch( (e) =>{}
    console.error("SOMETHING WENT WRONG!!!");
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM