我有一系列承诺功能,我正在联系在一起。我不需要上一个函数的具体结果,所以我没有在resolve()中添加任何内容;我只需要它们按顺序运行。
但是,我希望将包含范围中的变量传递给第一个和第四个(最后一个)承诺。当我将它作为参数添加到第三个promise时,该函数立即运行。
如何将参数传递给链式承诺,而不是在那时调用函数/ promise?
以下是我正在尝试做的基础知识:
const containingFunction = function() {
const varToPass = document.querySelector("#ID").value.trim();
firstPromise(varToPass)
.then(secondPromise)
.then(thirdPromise)
.then(fourthPromise(varToPass))
.catch(e =>{
console.error(e));
} );
};
FourthPromise:
const fourthPromise = function(varPassed) {
return new Promise(function(resolve, reject) {
do some stuff but only after the thirdPromise has been resolved
console.log(varPassed)
resolve();
});
};
答案 0 :(得分:2)
根据您要解决的问题varToPass
,您有两种可能性。
使用@Jaromanda X描述的lambda函数(没有自己作用域的匿名函数):
() => return fourthPromise(varToPass)
这将导致函数保持对变量的引用而不是其值。一旦触发第四个促销,就会评估varToPass
的值,而不是在运行此代码时。{/ p>
第二个选项是使用包装器,即返回函数的函数:
function fourthPromise(varToPass) {
return function() {
return new Promise(function(resolve, reject) {
do some stuff but only after the thirdPromise has been resolved
console.log(varToPass)
resolve();
});
};
}
在这种情况下,传递的变量的值在此代码运行时计算,而不是在调用回调时计算。
哪种选择更适用于您的案例,但我们无法在没有更多背景的情况下告诉您。
答案 1 :(得分:1)
非常简单的改变
const containingFunction = function() {
const varToPass = document.querySelector("#ID").value.trim();
firstPromise(varToPass)
.then(secondPromise)
.then(thirdPromise)
.then(() => fourthPromise(varToPass))
.catch(e =>{
console.error(e));
} );
};