在以下测试代码中,我尝试将带有参数(即t2,t3)的预定义函数传递给。但是它抱怨“ r”没有定义。
var Promise = require('bluebird');
var t2 = function(r) {
console.log("2r: " + r);
return 2 * r;
};
var t3 = function(r) {
console.log("3r: " + r);
return 3 * r;
};
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(1);
reject(2)
}, 1000);
})
.then(t2(r), t3(r))
.then(t2(r), t3(r))
.then(t2(r), t3(r));
答案 0 :(得分:1)
只需传递函数名称即可:
var t2 = function(r) {
console.log("2r: " + r);
return 2 * r;
};
var t3 = function(r) {
console.log("3r: " + r);
return 3 * r;
};
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(1);
reject(2)
}, 1000); // (*)
})
.then(t2, t3)
.then(t2, t3)
.then(t2, t3);
如果您实际上 要传递您事先知道的其他参数 ,请将t2
和t3
设置为高阶函数,它们返回函数,以便您可以在.then
的参数列表中调用:
var t2 = extra => r => {
console.log("2r: " + r);
console.log('extra param: ' + extra);
return 2 * r;
};
var t3 = extra => r => {
console.log("3r: " + r);
console.log('extra param: ' + extra);
return 3 * r;
};
const r = 'foo';
new Promise(function(resolve, reject) {
setTimeout(function() {
resolve(1);
reject(2)
}, 1000); // (*)
})
.then(t2(r), t3(r))
.then(t2(r), t3(r))
.then(t2(r), t3(r));
答案 1 :(得分:0)
您没有将r
传递给函数。 .then
将值传递给回调。
new Promise(function (resolve, reject) {
setTimeout(function () {
resolve(1)
reject(2)
})
})
.then((r) => /* do stuff with r here */)
如果您需要注销结果,则将有类似.then((r) => { t2(r); t3(r); })
的内容。如果只需要返回乘法函数的结果(或其他结果),.then(t2)
就可以工作(对于一个函数)。请注意,我在这里使用箭头功能。它们现在可以在Node和大多数浏览器中使用,但是如果需要,可以改用function
关键字。
在这里您还奇怪地使用了逗号运算符-请记住,它与声明和 then 返回基本相同,并且由于您的函数不会执行任何突变( log
的副作用),您实际上不会使用每个.then
中的第一个功能来影响任何数据。