【发布时间】:2018-06-15 02:44:37
【问题描述】:
问题:
我一直在拼命想弄清楚为什么我使用 $.when.apply().then() 编写的一些代码来解决多个承诺然后返回数据似乎不同步,返回一个未解析的promise,然后在回调已经被调用后解析promise。
这是我一直在使用的模拟代码:
format(function(r) {
console.log('Done!', r);
});
function format(callback) {
var promises = [];
var items = [
{model: 'George'}
];
$.each(items, function (i, item) {
var selectedSeries = item.model;
promises.push(getSeriesDescription(selectedSeries));
});
$.when.apply($, promises).then(function (seriesInfo) {
console.log('Calling back');
callback(seriesInfo);
});
}
function getSeriesDescription(series) {
return new Promise(function (resolve, reject) {
getSeriesNotes().then(function (notes) {
console.log('Processing Notes...');
var rNotes;
$.each(notes.data, function () {
if (series !== 'undefined') {
console.log('Checking series ' + this.first_name + ' against ' + series + '...');
if (this.first_name == series) {
console.log('Series found!');
rNotes = this;
return false;
}
}
});
if (rNotes !== undefined) {
console.log('Returning series specific notes...');
resolve(rNotes);
} else {
resolve(notes);
}
});
});
}
function getSeriesNotes() {
return $.ajax({
url: 'https://reqres.in/api/users?delay=2',
dataType: 'json',
type: 'GET',
data: '',
});
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
我的发现:
经过大量调试后,我终于意识到意外行为似乎是我使用的 jQuery 版本的结果。下面我有两个使用完全相同的代码的小提琴,使用不同版本的 jQuery。 (我发布 jsfiddles 是因为 StackOverflow 没有 jQuery 的 3.x 版本)
jQuery 2.1.3:
https://jsfiddle.net/persononfire/1epgnfuh/2/
jQuery 3.1.1:
https://jsfiddle.net/persononfire/a9gc0y14/
通过查看控制台中的每一个,您会发现 v3 版本会按照我的预期返回,而 v2 版本则不会。
预期结果:
处理笔记...
(index):58 检查系列 George 对 George...
(索引):找到 60 个系列!
(index):67 返回系列特定笔记...
(index):46 回调
(索引):31 完成! {id: 1, first_name: "George", last_name: "Bluth", 头像: "https://s3.amazonaws.com/uifaces/faces/twitter/calebogden/128.jpg"}
2.1.3 版首先返回最后两行,然后按照我期望的顺序返回所有其他内容。
问题:
所以我的问题是;为什么 jQuery 的两个版本之间的结果存在差异?我无法在版本文档中找到任何在我看来会导致两个 jQuery 版本之间的行为差异的内容。
我感谢任何对此的见解,以对我自己的启发。
【问题讨论】:
-
您是否需要使其与 v2 一起使用,或者这只是一个兴趣问题?
-
不确定到底有什么区别,但这似乎是由于使用
Promise(),因为在v2中使用$.Deferred()可以正常工作 -
@T.J.Crowder 好吧,两者都有。我被锁定在 2 中,但我想我可以弄清楚如何解决它。但我很好奇其中的区别。
-
这是我之前评论的证明:jsfiddle.net/1epgnfuh/7
标签: javascript jquery ajax promise