2017-02-14 93 views
0

我正在努力围绕js中的异步和承诺概念。我无法弄清楚为什么下面的代码不会在控制台上打印任何东西。Javascript承诺和异步代码

我假设这是因为我的Promise中的代码不是异步的,但不是承诺的要点:使某些同步变为异步?

如果不是这种情况,我怎么能真正“转换”同步代码为异步,而不使用任何内置的js函数(setTimeOut等)?

function countdown(seconds) { 
    return new Promise(function(resolve, reject) { 
     for (let i = seconds; i >= 0; i--) { 
      if (i > 0) console.log(i + '...'); 
      else resolve(console.log("GO!")); 
     } 
    } 
}; 
count = countdown(5).then(() => console.log('Completed'), (err) => console.log(err.message)); 
+0

“*不是承诺的要点:使某个同步变成异步吗?*”不,绝对不是。 [promise of point](http://stackoverflow.com/a/22562045/1048572)是通过将事务视为可返回值来处理已经异步的事情。在你的例子中,你有一个同步循环,在这里没有理由使用承诺。 – Bergi

+0

'我不明白为什么下面的代码不会在我的控制台上打印任何东西 - - 什么?甚至没有关于缺少'''的错误?使用更好的浏览器 –

+0

,因为它的本质,javascript是同步的(等待抗议声音减弱)...任何异步的(非本地)函数都是由于该函数直接引起的,或者间接调用其中一个“本地”函数这是异步的 - 因此,将某些代码从同步转换为异步的唯一方式是使用本质上是异步的许多“本地”函数中的一个(再次,直接或间接地通过其他最终将具有的函数直接调用其中一个异步函数) –

回答

2

我怎么可能真正的 “改造” 同步后,现在工作代码到异步而不使用任何内置的js函数(setTimeOut等)?

通过它的性质,JavaScript代码是同步(抗议的怒吼等待减弱) ...

每一个(非本地)函数是异步的是由于该功能,任一

  1. 直接调用的那些本机异步功能中的一个,或
  2. 调用一个调用的函数等的其它功能,最终调用一个O ˚F这些异步函数直接

从同步转变一些代码来异步的唯一方法是使用的许多“天然”函数在本质上(再次,无论是直接,或间接地通过其它功能异步一个最终将不得不直接调用这些异步函数中的一个)

2

它缺少),并补充说,括号..运行段检查

function countdown(seconds) { 
 
    return new Promise(function(resolve, reject) { 
 
     for (let i = seconds; i >= 0; i--) { 
 
      if (i > 0) console.log(i + '...'); 
 
      else resolve(console.log("GO!")); 
 
     } 
 
    }) // <---⚠️ I mean this parenthesis 
 
}; 
 
count = countdown(5).then(() => console.log('Completed'), (err) => console.log(err.message));

+0

当我看到它时,我无法停止笑。大声笑 –

+0

我真的很高兴你..这是很好写的有趣的答案。 –

+1

更好地检查一下linter ...谢谢! – user3682983