节点绑定和承诺

时间:2016-12-29 00:04:37

标签: node.js promise bind

我用Google搜索了一些绑定解释,但仍然非常困惑。我通过以下方式使用bind和promise。它正在工作,但我不知道为什么。希望有人可以解释并帮助我解决一个小问题。以下是示例代码:

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。如何保持链(也没有额外的链),而我仍然可以访问之前的下一个函数的参数中的前一个输出属性。 谢谢!

2 个答案:

答案 0 :(得分:1)

Function.prototype.bind()

  

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,所以我们可以将它链接到下一个承诺解析器