在 Bluebird 中传递变量的正确方法?

The correct way to pass down variables within Bluebird?

例如:

redis.get('xfers:Turkey').then( data => {
    var GAME_ID = 25;
    return [returnPromise, returnPromise2]
}).spread( (success, success2) => {
    //GAME_ID here is undefined
});

但是,您可以这样做:

redis.get('xfers:Turkey').then( data => {
    var GAME_ID = 25;
    return [returnPromise, returnPromise2, GAME_ID]
}).spread( (success, success2, GAME_ID) => {
    //GAME_ID here is passed
});

效果很好,我就是觉得我做错了什么。如果我创建了很多变量,我将需要传递很多 arguments。 (对于每个连续的链也是如此)——我很好奇是否有更直观的方法,谢谢!

首先,回答您的问题 - 是否有更直观的方式将值传递到承诺链中 - 不,根据我的经验 'returning' 作为下一个回调参数的值是您可以获得的最佳值。

不过,如果您明智地使用这些基本工具,您仍然可以实现良好的代码清晰度和可维护性。以下是我在编写承诺链时使用的一些基本规则:

  1. 不依赖于任何承诺结果的变量应该在闭包中本地设置。在您的示例中,GAME_ID 看起来很适合。
  2. 如果可能,一次执行一个异步操作。这意味着 return 数组然后 'spreading' 比简单的单项管道可读性差。
  3. 仅当您确实必须异步执行某些操作时才使用 Promise。有时 return 一个同步计算的值并将其作为参数传递到链下是很有说服力的,但你应该记住,承诺不是免费的,它是以事件循环滴答为代价的。