为什么我的代码有时会在"C"
之前打印"A"
?
function printstring(string) {
return new Promise((resolve, reject) => {
setTimeout(function() {
document.write(string);
resolve();
}, Math.floor(Math.random() * 100) + 1);
})
}
function printall() {
printstring("A")
.then(printstring("C"))
}
printall();
答案 0 :(得分:4)
then
期待回调。调用此回调,并将promise的已解析值作为参数传递。
在您的代码中,您提供了printstring('C')
作为回调。因此,printstring('C')
的结果将再次作为一个承诺将与响应一起执行。由于您已使用随机超时执行,因此文档上的打印顺序将取决于它。如果打印C的超时在打印A超时之前到期,则肯定会先打印C.
要更正此问题,请使用匿名函数作为then
回调,即将其转换为:
.then(printstring("C"))
到此:
.then(() => printstring("C"))
请参阅以下工作演示:
function printstring(string) {
return new Promise((resolve, reject) => {
setTimeout(function() {
document.write(string);
resolve();
}, Math.floor(Math.random() * 100) + 1);
})
}
function printall() {
printstring("A")
.then(() => printstring("C"))
}
printall();
答案 1 :(得分:4)
printstring("A")
.then(printstring("C"))
等于:
const promise1 = printstring("A");
const promise2 = printstring("C");
promise1.then(promise2)
所以基本上你同时开始这两个动作,而不是一个接着一个。传递承诺作为回调并不是真的有意义。相反,您可能希望在开始下一个操作之前等待第一个承诺解决:
printstring("A").then(function() {
printstring("C");
});
答案 2 :(得分:0)
这与承诺无关,我相信。
每当你写这样的代码 -
gameOver(global1,global2,global3,global4,...)
你需要确保传递回调函数对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);
完全错了。这类似于您使用// Executes the callback function and passes it's result into mainFn
mainFn(callbackFn());
所做的事情。它将首先执行.then(printstring("C"))
。
所以,要解决这个问题,请将它包装在一个匿名函数中 -
printstring("C")