链接承诺与当然的承诺()

Dom*_*oSL 16 javascript promise

你如何在这样的场景中链接?

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();
     })

   })
}
Run Code Online (Sandbox Code Playgroud)

Srl*_*rle 9

据我所知,你想要做什么,下面的代码也将解决asset2.除此之外,我猜api函数正在执行http请求,因此您可以使用request-promiselib而不是使用new Promisething 转换回调api .

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

function auth() {
   return api("/foo")
   .then(() => api("/bar"))
}
Run Code Online (Sandbox Code Playgroud)

有了这个调用者会做类似的事情:

auth()
.then(asset2 => ...)
.catch(err => ...)
Run Code Online (Sandbox Code Playgroud)

如果调用顺序api不重要,就像@styfle在评论中指出的那样,你可以用它来编写它Promise.all

function auth () {
  return Promise.all([
    api("/foo"),
    api("/bar")
  ])
}
Run Code Online (Sandbox Code Playgroud)


小智 8

一种更清洁的方法:

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!!!");
);
Run Code Online (Sandbox Code Playgroud)


Rôm*_*ias 5

我认为这应该对您有帮助。

只是观察: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)
})
Run Code Online (Sandbox Code Playgroud)


小智 5

根据Promises标准

如果x是一个承诺,则采用其状态[3.4]:如果x是未决的,则诺言必须保持待定,直到x被实现或拒绝为止。如果/何时满足x,则以相同的值实现promise。如果/当x被拒绝时,以同样的理由拒绝promise。

下一个示例显示“ 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')
Run Code Online (Sandbox Code Playgroud)