【问题标题】:Flat promise chain series with each promise call dependent upon resolution of prior call平坦的承诺链系列,每个承诺调用取决于先前调用的解决方案
【发布时间】:2017-08-11 04:13:22
【问题描述】:

如果前面的 Promise 没有嵌套在初始 Promise then 语句中就无法解析,那么推荐的扁平化 Promise 系列的方法是什么,以便后续 Promise 不会运行?

如果 promise 1 没有解决,我不想运行 promise 2。

var promise1 = new Promise((resolve, reject) =>{
  reject('catch 1')
});

var promise2 = new Promise((resolve, reject) =>{
  resolve('pass 2')
});

我想这样做:

var p1Resolved = promise1.then(result=>{
   handleResult(result);
})
.catch(error => {
   handleError(error);
})

if(p1Resolved) 
{
    promise2.then(result=>{
       handleResult(result);
    })
   .catch(error => {
      handleError(error);
   })
}

我不想这样做(然后将 promise2 嵌套在 promise1 中):

promise1.then(result=>{
   promise2.then(result=>{
       handleResult(result);
    })
   .catch(error => {
      handleError(error);
   })
})
.catch(error => {
   handleError(error);
})

【问题讨论】:

  • 在所有示例中,您总是运行promise2。你能解释一下为什么你不想嵌套承诺吗?
  • 把它变成一个函数并在必要时调用? var promise2 = () => new Promise((resolve, reject) =>{ resolve('pass 2') });
  • 对于第一个评论,我宁愿尽可能写扁平化语句,并想知道是否有这样做的模式。对于第二条评论,我不确定在函数中的包装如何提供一个平面模式,其中 2 不运行,除非 1 被解析并且 2 没有嵌套在 1 中。你能用我要求的模式发布一个工作示例吗?谢谢。
  • 使用像 $q、async 或 bluebird promise 这样的库来处理你的 promise。它很容易,做你想做的事
  • 有没有一种方法可以在没有库的情况下仅使用一些承诺链接语法来做到这一点?

标签: javascript promise


【解决方案1】:

把promise2变成一个函数(为了一致性,也可以用promise1)

var promise1 = () => new Promise((resolve, reject) => reject('catch 1'));
var promise2 = () => new Promise((resolve, reject) => resolve('pass 2'));

promise1()
.then(result => promise2())
.then(result => console.log('done'))
.catch(reason => console.log('error', reason));

【讨论】:

  • 谢谢。这是我一直在寻找的模式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2015-04-09
  • 2016-12-06
  • 2022-10-31
  • 2015-06-24
  • 2021-06-01
相关资源
最近更新 更多