基本上,我需要2个函数A和B才能从休息中获取数据,然后我想在成功获取数据后运行函数C
这是我的代码:
JS:
var A = function() {
$.getJSON('linkA', function(data) {
a = data.total;
console.log("A : " + a);
});
return new Promise(function(resolve, reject) {
resolve('Got a');
});
};
var B = function() {
$.getJSON('linkB', function(data) {
b = data.total;
console.log("B:" + b);
});
return new Promise(function(resolve, reject) {
resolve('Got b');
});
};
function run() {
Promise.all([A(), B()]).then(function() {
console.log("Got A and B")
});
}
HTML:
<script>
run();
</script>
我希望结果应该在Console中:
A://数据
B://数据
得到A和B
然而,在其他两行之前我仍然有“得到A和B”。我想因为获取数据需要很长时间,因此程序首先编写“得到A和B”。但是必须有一些方法来实现目标吗?
答案 0 :(得分:4)
你会立即解决这些承诺,而不是等到你收到数据后才能解决。
你也成了承诺创造反模式的牺牲品。 $.getJSON
已经为您提供了一个*,所以只需使用它并使用then
转换数据(通过访问total
):
var A = function() {
return $.getJSON('linkA').then(function(data) {
return data.total;
});
};
与B
相同。然后,您的Promise.all
代码就会生效,如果您调整它,您实际上可以获得a
和b
:
function run() {
Promise.all([A(), B()]).then(function(results) {
var a = results[0], b = results[1];
// ...use `a` and `b`...
});
}
或者,如果您可以依赖ES2015 +功能,您可以使用箭头功能和解构(或正常功能和解构,如果您愿意):
function run() {
Promise.all([A(), B()]).then(([a, b]) => {
// ...use `a` and `b`...
});
}
由于你的其余代码只依赖于jQuery,而不是浏览器中的Promise支持,你也可以使用jQuery的$.when
:
function run() {
$.when(A(), B()).then(function(a, b) {
// ...use `a` and `b`...
});
}
如果 您需要明确地执行new Promise
(您不在此处)与不可用的API进行交互,它将如下所示:
// YOU DON'T NEED TO DO THIS WITH $.getJSON, but with non-thenable APIs you might
var A = function() {
return new Promise(function(resolve, reject) {
$.getJSON('linkA', function(data) {
resolve(data.total);
}).fail(function(jqXHR, textStatus, errorThrown) {
reject(errorThrown || new Error(textStatus));
});
});
};
*“thatable” - 类似承诺的事情,请参阅the Promises/A+ spec。
答案 1 :(得分:0)
var url = 'https://jsonplaceholder.typicode.com/posts/';
Promise.all( [url + 1, url + 2 ].map( $.get ) )
.then(
console.log
)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>