Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/476.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript混乱中的承诺_Javascript_Promise - Fatal编程技术网

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”)
,并将其结果作为回调传递。它不会在意承诺是否得到了解决。这是一个打字错误,使用一个带有适当规则的过梁或承诺库,它会像蓝鸟一样给你警告。