在 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' 作为下一个回调参数的值是您可以获得的最佳值。
不过,如果您明智地使用这些基本工具,您仍然可以实现良好的代码清晰度和可维护性。以下是我在编写承诺链时使用的一些基本规则:
- 不依赖于任何承诺结果的变量应该在闭包中本地设置。在您的示例中,
GAME_ID
看起来很适合。
- 如果可能,一次执行一个异步操作。这意味着 return 数组然后 'spreading' 比简单的单项管道可读性差。
- 仅当您确实必须异步执行某些操作时才使用 Promise。有时 return 一个同步计算的值并将其作为参数传递到链下是很有说服力的,但你应该记住,承诺不是免费的,它是以事件循环滴答为代价的。
例如:
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' 作为下一个回调参数的值是您可以获得的最佳值。
不过,如果您明智地使用这些基本工具,您仍然可以实现良好的代码清晰度和可维护性。以下是我在编写承诺链时使用的一些基本规则:
- 不依赖于任何承诺结果的变量应该在闭包中本地设置。在您的示例中,
GAME_ID
看起来很适合。 - 如果可能,一次执行一个异步操作。这意味着 return 数组然后 'spreading' 比简单的单项管道可读性差。
- 仅当您确实必须异步执行某些操作时才使用 Promise。有时 return 一个同步计算的值并将其作为参数传递到链下是很有说服力的,但你应该记住,承诺不是免费的,它是以事件循环滴答为代价的。