var temp1 = function(){
return new Promise(function(resolve, reject){
resolve("hello");
});
};
var temp2 = function(para1, para2){
console.log("1:", para1);
console.log("2:", para2)
return new Promise(function(resolve, reject){
resolve(para1+" "+para2);
});
};
temp1().then(temp2.bind(null,"world")).then(function(out){
console.log(out);
});
输出:
1:世界 2:你好 世界你好\
我用" bind"因为它可以使代码更清晰,更容易进行错误处理,否则我必须使用以下内容:
temp1().then(function(out1){
return temp2(out1, "world").then(function(out2){
console.log(out2);
});
});
除了绑定如何工作,我还有以下问题:
temp1().then(temp2.bind(null,/*the second param is a property of the output from temp1*/)).then(function(out){
console.log(out);
});
我知道我总是可以打破链条或添加额外的链来实现它: 例如
temp1().then(function(out1){
return temp2(out1, (out1.length).to_String()).then(function(out2){
console.log(out2);
});
});
但是如果不打破链条就太棒了。
所以我的两个问题:1。绑定是如何工作的,2。如何保持链(也没有额外的链),而我仍然可以访问之前的下一个函数的参数中的前一个输出属性。 谢谢!
答案 0 :(得分:1)
bind()方法创建一个新函数,在调用时,将其this关键字设置为提供的值,并在调用新函数时提供任何前面提供的给定参数序列。
从技术上讲,temp2.bind(null,"world")
将返回一个函数并将null,"world"
作为参数传递。然后,这些参数与temp1
的结果合并,"hello"
在索引0
处。"hello", "world"
。因此,传递给temp2的实际参数是temp1()
.then(function (out) {
return temp2(out,"world")
})
.then(function(out){
console.log(out);
});
。
要保持链条,你可以写:
A B
-- --
a 1
b 1
c 1
d 1
d 2
e 1
f 1
f 2
g 1
这就是为什么人们创造了Promise,以便你可以很好地链接它们。您给出的示例有效,但它类似于Callback Hell。
答案 1 :(得分:0)
bind()
用于为稍后调用的函数设置适当的上下文。我不认为你需要在这种情况下使用它。如果您使用的是es6
,您可以这样做:
temp1()
.then(out1 => temp2(out1, out1.length.toString()))
.then(console.log)
.catch(console.log);
这使用隐式返回。这是有效的,因为temp2()
也会返回一个promsie,所以我们可以将它链接到下一个承诺解析器