javascript混乱中的承诺
为什么我的代码有时会在javascript混乱中的承诺,javascript,promise,Javascript,Promise,为什么我的代码有时会在“A”之前打印“C” 函数printstring(string){ 返回新承诺((解决、拒绝)=>{ setTimeout(函数(){ document.write(字符串); 解决(); },Math.floor(Math.random()*100)+1); }) } 函数printall(){ 打印字符串(“A”) 。然后(打印字符串(“C”)) } printall()然后需要回调。调用此回调,并将承诺的解析值作为参数传递 在代码中,您提供了printstring(
“A”之前打印“C”
函数printstring(string){
返回新承诺((解决、拒绝)=>{
setTimeout(函数(){
document.write(字符串);
解决();
},Math.floor(Math.random()*100)+1);
})
}
函数printall(){
打印字符串(“A”)
。然后(打印字符串(“C”))
}
printall()代码>然后
需要回调。调用此回调,并将承诺的解析值作为参数传递
在代码中,您提供了printstring('C')
作为回调。因此,printstring('C')
的结果也将与响应一起执行。由于执行时使用了随机超时,因此文档的打印顺序将取决于此。如果打印C的超时在打印A的超时之前过期,则肯定会首先打印C
若要更正此问题,请使用匿名函数作为然后
回调,即转换此函数:
.then(printstring("C"))
为此:
.then(() => printstring("C"))
请参阅以下工作演示:
函数printstring(string){
返回新承诺((解决、拒绝)=>{
setTimeout(函数(){
document.write(字符串);
解决();
},Math.floor(Math.random()*100)+1);
})
}
函数printall(){
打印字符串(“A”)
。然后(()=>printstring(“C”))
}
printall()代码>
等于:
const promise1 = printstring("A");
const promise2 = printstring("C");
promise1.then(promise2)
所以基本上你同时开始两个动作,而不是一个接一个。以回调的形式传递承诺实际上没有意义。相反,在开始下一个操作之前,您可能希望等待第一个承诺得到解决:
printstring("A").then(function() {
printstring("C");
});
我相信这与承诺无关
无论何时编写这样的代码-
function mainFn(callback) {
// do async stuff
// call callback when done
callback();
}
// callback handler
function callbackFn() {
console.log('callback fn');
}
您需要确保将回调函数的引用传递给mainFn()
的回调参数,如下所示-
// Passess reference to callback function inside mainFn
mainFn(callbackFn);
function printall() {
printstring("A")
.then(function() { printstring("C"); })
}
然而,做一些像-
// Executes the callback function and passes it's result into mainFn
mainFn(callbackFn());
这是完全错误的。这类似于您使用所做的操作。然后(printstring(“C”)
。它将首先执行printstring(“C”)
所以,为了解决这个问题,将其包装在一个匿名函数中,如下所示-
// Passess reference to callback function inside mainFn
mainFn(callbackFn);
function printall() {
printstring("A")
.then(function() { printstring("C"); })
}
但在打印A之前,不应调用回调,即resolve@31pjy@FauadHaleem--关键是首先调用printstring(“C”)
,并将其结果作为回调传递。它不会在意承诺是否得到了解决。这是一个打字错误,使用一个带有适当规则的过梁或承诺库,它会像蓝鸟一样给你警告。