Javascript 为什么要使用Promise()?

Javascript 为什么要使用Promise()?,javascript,promise,Javascript,Promise,无论我读了多少教程,我仍然不明白为什么我应该使用Promise() 好,让我们举个例子: let cleanedUpMyRoom = new Promise(function(resolve, reject) { if (true === true) { resolve(true); } else { reject(false); } }); cleanedUpMyRoom.then(function(result) { console.log(r

无论我读了多少教程,我仍然不明白为什么我应该使用
Promise()

好,让我们举个例子:

let cleanedUpMyRoom = new Promise(function(resolve, reject) {
    if (true === true) {
    resolve(true);
  }
  else {
    reject(false);
  }

});

cleanedUpMyRoom.then(function(result) {
    console.log(result);
});
此代码返回
true
false

function cleanedUpMyRoom() {
    if (true === true) {
    return true;
  }
  else {
    return false;
  }
}

console.log(cleanedUpMyRoom());
此代码还返回
true
false

function cleanedUpMyRoom() {
    if (true === true) {
    return true;
  }
  else {
    return false;
  }
}

console.log(cleanedUpMyRoom());

如果第二段代码较短且易于阅读,为什么要使用第一段代码?

Javascript是一种事件驱动语言。在您的简短示例中,您认为使用承诺毫无意义是正确的。在更复杂的情况下,比如对服务器的AJAX请求,代码不会立即执行


Javascript不能像其他命令式语言(如python或java)那样简单地返回值。承诺的优点是不阻塞主线程,一旦承诺完成,代码将开始运行。它使javascript成为一种通过事件抽象来管理短时间突发活动的优秀语言。

正如一些人所指出的,承诺通常用于序列化异步操作。这个想法是作为嵌套回调的一种替代,人们通常称之为“回调地狱”。例如,具有回调的内容,如:

asyncFn1(
          function(result1){
                            asyncFn2(result1,
                                     function(reult2){
                                        asyncFn3(result2)}
                                     )}
         )
可以使用以下承诺重写:

asyncFn1()
.then(function(result1){asyncFn2(result1)})
.then(function(result2){asyncFn3(result2))
对于同时存在成功和失败处理程序以及函数依赖于其他异步操作结果的复杂情况,这可以简化逻辑并大大提高可读性

要查看您的
cleanedUpMyRoom
示例,更常见的实现是:

cleanUpMyRoom = function(){
   cleanPromise = new Promise();

   startCleaning(/*on success*/ function(){console.log('Room cleaned!');
                                           cleanPromise.resolve()},
                 /*on failure*/ function(){console.log('Room cleaned!');  
                                           cleanPromise.resolve(result)})

   // or *alternatively* if it's just plain synchronous, 
   // var result = cleanIt()
   // if (result = "success")
   //   cleanPromise.resolve()
   // else
   //   cleanPromise.reject(result)

   return cleanPromise
});
然后

cleanUpMyRoom()始终返回一个包含then函数的承诺。重要的一点是,传递给
然后
的函数不会被调用,直到承诺被解析或拒绝,并且承诺生成函数的结果准备就绪(无论是同步还是异步)

最终,promise允许您将结果可能在同步过程代码中不可用的操作链接在一起,以便在满足可用的、可能是异步的(如网络请求)前提条件之前,不会调用任何操作,同时您的代码能够管理其他事件

看看这个:

您可能还对即将推出的(ES2017)
async/await
语法感兴趣,该语法正变得越来越流行,可以处理许多异步情况,而根本不需要明确使用承诺:

对于将立即完成的同步操作,您不需要它,例如您所展示的异步代码的完全不同的故事,您不知道它何时会完成。在您的示例中,没有理由使用承诺。但是我们可以说,
cleanUpMyRoom
称为第三方web API
http://didyouclean.com/api/yourroom
在你继续之前,你需要回答这个问题,然后才需要承诺。您可以在这里了解更多:您应该只对异步代码使用承诺。你的例子不是异步的,真的吗?在您所说的关于承诺的所有文章中,您从未读过承诺是用于管理异步操作的,而不是用于您所展示的同步操作?你最好多读一些。承诺简化异步操作。它们不会简化同步操作,通常也没有理由将它们与同步代码一起使用。虽然在同步情况下使用承诺通常没有必要或没有帮助,但我们仍然可以想象在函数可以包含可选异步操作的情况下使用它们。。。甚至对于一个想要作为(或可与之互换)异步版本的同步函数。此外,我认为没有理由投反对票——这对不熟悉的人来说可能是一个普遍有用的问题。