JavaScript承诺解决了什么问题?或者它们到底是什么?
我已经用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); }); 从
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对象的概念实际上并不是承诺,