比如,
Q "Hello world"
.then (str)->
"hello 2"
.then (str2)->
# str 怎么获取?
备选方案 1:闭包法
Q "hello world"
.then (str)->
Q "hello 2"
.then (str2)->
console.log str, str2
缺点:不好看,陷入了 callback hell。
备选方案 2:外部变量法
str = null
Q "hello world"
.then (s)->
s = str
"hello 2"
.then (str2)->
console.log str, str2
缺点:用跨越作用域的变量,显得不太干净
备选方案 3:返回数组法
Q "hello world"
.then (str)->
[str, "hello 2"]
.then (s)->
console.log s[0], s[1]
缺点:返回值意义不明朗;要向下传递多层的时候麻烦。
所以大家遇到这种问题的时候怎么办?
1
br00k 2015-06-14 23:11:00 +08:00
我自己用的第一种。。
|
2
xream 2015-06-14 23:19:17 +08:00 2
我知道用 bluebird 可以 bind 到 this 上
.bind() also has a useful side purpose - promise handlers don't need to share a function to use shared state: somethingAsync().bind({}) .spread(function (aValue, bValue) { this.aValue = aValue; this.bValue = bValue; return somethingElseAsync(aValue, bValue); }) .then(function (cValue) { return this.aValue + this.bValue + cValue; }); |
3
lilydjwg 2015-06-14 23:22:00 +08:00
理论上方案三最好。如果数组意义不明确,那么就用 object。实践上方案一写起来方便,但是变量太多的话效果与全局变量类似。
|
4
fundon 2015-06-14 23:26:36 +08:00 1
`spread` 返回多个值,是最方便的
|
5
joyee 2015-06-14 23:54:12 +08:00 1
用方案三,但用object。如果能用 ES6,配合 ES6 的 object literal shorthand
Promise.resolve("hello world") .then(str => ({str1: str, str2: "hello 2"})) .then(({str1, str2}) => console.log(str1, str2)) |
7
MForever78 2015-06-15 00:13:15 +08:00 3
首先比较推荐使用 bluebird,API 比较丰富,性能也比较高,比 io.js 原生实现的都快。
如果几个执行过程是相互独立的,只是最终的返回的结果需要用到所有过程的结果,那就用 .spread Promise.delay(500).then(function() { return [fs.readFileAsync("file1.txt"), fs.readFileAsync("file2.txt")] ; }).spread(function(file1text, file2text) { if (file1text !== file2text) { console.log("files are equal"); } else { console.log("files are not equal"); } }); 如果后面的过程依赖前面过程的结果,就用第三种,传递的时候用 Object。 |
8
Axurez 2015-06-15 12:38:52 +08:00
这是啥语言?
|
10
oott123 OP @xream @MForever78 @fundon 谢谢你们,我觉得我心目中最好的方法大概就是 `spread` 这个 api。
至于 bluebrid 和 Q 嘛……一开始接触到的就是 Q 就一直用了,不过我倒是觉得 Q 的 api 比 bluebird 的好用一些…… @joyee coffee 里没有这么好用的语法…… coffee 作者似乎对 ES6 比较抵触。 @Axurez 是 coffeescript。 |
12
otakustay 2015-06-15 14:10:25 +08:00
我会选第三种,这种情况下数组其实是一个Tuple,从这个角度理解就是一个非常正常的数据结构了
其实更多的我会在第三种的基础上返回对象 |