Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/73.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_Jquery_Ajax_Asynchronous_Promise - Fatal编程技术网

JavaScript承诺解决了什么问题?或者它们到底是什么?

JavaScript承诺解决了什么问题?或者它们到底是什么?,javascript,jquery,ajax,asynchronous,promise,Javascript,Jquery,Ajax,Asynchronous,Promise,我已经用JavaScript编程好几年了,直到最近才听到“承诺”这个词。我在网上读过多篇关于它的文章,但仍然不明白什么是承诺。我没有看到任何严格的定义。我看到的每一个例子都是一个我已经知道如何解决的问题。比如说, get('story.json').then(function(response) { console.log("Success!", response); }, function(error) { console.error("Failed!", error); }); 从

我已经用JavaScript编程好几年了,直到最近才听到“承诺”这个词。我在网上读过多篇关于它的文章,但仍然不明白什么是承诺。我没有看到任何严格的定义。我看到的每一个例子都是一个我已经知道如何解决的问题。比如说,

get('story.json').then(function(response) {
  console.log("Success!", response);
}, function(error) {
  console.error("Failed!", error);
});
从那时起,我就知道怎么做了

$.ajax({
   url : 'story.json',
   method : 'GET',
   success : function(response) { console.log("Success!", response); },
   error : function(error) { console.error("Failed!", error); }
});

那么,我是不是在不知道这个词的情况下使用了承诺的概念?或者我错过的大型派对在哪里

加法可以将事物链接起来。 如果你需要打三个电话,而这些电话都必须一个接一个地打,你可以将你的承诺连成一个链条,而不是:

$.ajax({
  success () {
    $.ajax({
      success () {
        $.ajax({
          success () { /* do something with your sets of results */ }
        });
      }
    });
  }
});
相反,您可以执行以下操作:

fetch(url1).then(toJSON)
  .then(result1 => fetch(url2).then(toJSON))
  .then(result2 => fetch(url3).then(toJSON));

这两个示例所做的事情并不完全相同(您需要使用每个结果,或传递它,以传递它),但基本上承诺包装您的流程并返回一个对象(使用
.then
方法),该方法允许您添加回调(并不断添加它们)。

添加的内容能够链接。 如果你需要打三个电话,而这些电话都必须一个接一个地打,你可以将你的承诺连成一个链条,而不是:

$.ajax({
  success () {
    $.ajax({
      success () {
        $.ajax({
          success () { /* do something with your sets of results */ }
        });
      }
    });
  }
});
相反,您可以执行以下操作:

fetch(url1).then(toJSON)
  .then(result1 => fetch(url2).then(toJSON))
  .then(result2 => fetch(url3).then(toJSON));

这两个示例所做的事情并不完全相同(您需要使用每个结果,或传递它,以传递它),但基本上承诺包装您的流程并返回一个对象(使用
.then
方法),该对象允许您添加回调(并不断添加它们).

您的第二个示例是jQuery对承诺的实现。@fskirschbaum一点也不…@plalx确实如此。当然,尽管它取决于您使用的jQuery版本,但它是一个延迟版本,并给出与询问者所说的相同的“结果”,但本质上,是的,它是相同的概念。还有,我必须这样做。jQuery!==不过,这里的语法肯定不是最新的。现在,您确实希望将链与
.done()
一起使用,而不是传递设置对象。您的问题的答案有点复杂,但是使用
success:
.done()
回调函数来延迟XHR对象的概念实际上并不是承诺,您的第二个示例是promise的jQuery实现。@fskirschbaum一点也不…@plalx确实如此。当然,尽管它取决于您使用的jQuery版本,但它是一个延迟版本,并给出与询问者所说的相同的“结果”,但本质上,是的,它是相同的概念。还有,我必须这样做。jQuery!==不过,这里的语法肯定不是最新的。现在,您确实希望将链与
.done()
一起使用,而不是传递设置对象。您的问题的答案有点复杂,但是使用
success:
.done()
回调函数来延迟XHR对象的概念实际上并不是承诺,