在javascript混乱中的承诺

时间:2018-06-10 11:13:40

标签: javascript promise

为什么我的代码有时会在"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();

3 个答案:

答案 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")