【问题标题】:using response from promise later on in chain [duplicate]稍后在链中使用来自承诺的响应[重复]
【发布时间】:2016-09-26 19:16:58
【问题描述】:

我已经承诺链,第一个链中的响应应该稍后在链中(在 4 和 6)中使用,我使用一些全局变量来处理它,但这不是正确的方法,有一个有更好的方式来实现这一目标?

这是问题的一些说明...

var step1 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 1");
      resolve(20);
    }, ms);
  })
}
var step2 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 2");
      resolve();
    }, ms);
  })
};
var step3 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 3");
      resolve();
    }, ms);
  })
};

var step4 = (ms) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("Step 4, run : " + ms );
      resolve();
    }, ms);
  })
};


var globalVar = null;

//Promise chain
step1(500)
  .then((res) => {
     //Here I keep the response in global variable to use later on
     globalVar = res;
    log(res);
    return step2(300);
  }).then(() => {
    return step3(200);
  }).then(() =>{
   //Here I need to use the res from the first promise
    var lclvar = globalVar +200 ;
    return step4(lclvar);
  }).catch((err) => {
  log(err);
});

我发现了这个,但在这种情况下这没有帮助(至少无法处理它)

How do I access previous promise results in a .then() chain?

【问题讨论】:

  • 您找到的问题正是您的案例所需要的。请告诉我您对答案的不理解之处,或者您选择并尝试应用的答案之一中的哪个解决方案。请edit您的问题向我们展示您的尝试(没有奏效)!否则我必须将其作为副本关闭。
  • @Bergi -谢谢,我尝试将其拆分但没有成功...您的意思是像 phil answer 一样使用它吗?
  • 请发布该尝试的代码,以便我找出问题所在。如果您已经了解应该如何进行划分(“打破链条”),我们将能够解决它。
  • 是的,这里的两个答案都很好,他们的方法在副本中被描述为“Nesting (and) closures”和“Explicit pass-through
  • @Bergi - 帖子中的代码与我在产品中的代码完全相同(只是我正在调用我们公司的内部服务,这将使所有帖子都难以理解......),如果我们能够解决它,这会很棒,然后我可以在产品中使用它。

标签: javascript node.js promise bluebird q


【解决方案1】:

您可以将step2step3 等调用嵌套在第一个处理程序中,然后res 将可供所有人使用

step1(500).then((res) => {
  log(res);
  return step2(300)
    .then(() => step3(200))
    .then(() => step4(res + 200));
}).catch((err) => {
  log(err);
});

【讨论】:

  • 谢谢,但是嵌套 promise 不是一个坏习惯?
  • @JennyM 不,完全没问题,尤其是当你需要它的时候(比如这里)。你一定不要忘记return 内部承诺,以便外部链可以继续。
【解决方案2】:

如果你真的想把这个链接起来的话。这个想法是一个沿途的总线参数。它是在第一个承诺中作为闭包创建的。

你可以运行这段代码:

log=console.log
var step1 = (ms) => {
var Buss={p1:20};   
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 1");
      resolve(Buss);
    }, ms);
  })
}
var step2 = (ms,bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 2");
      resolve(bus);
    }, ms);
  })
};
var step3 = (ms,bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("This is step 3");
      resolve(bus);
    }, ms);
  })
};

var step4 = (bus) => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      log("Step 4, run : " + bus.p1 );
      log("bus arrives:",bus);
      resolve(bus);
    }, bus.p1);
  })
};




//Promise chain
step1(500)
  .then((res) => {
     //Here I keep the response in global variable to use later on
     //globalVar = res;
    log(res);
    return step2(300,res);
  }).then((res) => {
    return step3(200,res);
  }).then((res) =>{
   //Here I need to use the res from the first promise
    //var lclvar = globalVar +200 ;
    res.p1+=200;
    return step4(res);
  }).catch((err) => {
  log(err);
});

【讨论】:

    猜你喜欢
    • 2018-01-22
    • 2019-05-21
    • 1970-01-01
    • 2017-04-03
    • 2016-04-05
    • 1970-01-01
    • 2015-01-10
    • 2018-10-22
    • 2019-07-29
    相关资源
    最近更新 更多