我正在使用带有jQuery的promise.js,但我不想使用$ Deferred,因为根据Promises / A +,许多人说它不准确或最佳实践。
var promises = [];
var myArray = //something
function readFile(){
$.getJSON( "yyy.com/readfile?callback", function( data ) {
console.log('Reading File');
promises.push(data)
});
}
function writeFile(){
$.getJSON( "yyy.com/writefile?callback", function( data ) {
console.log('Writing File');
promises.push(data)
});
}
for(var i, i < myArray.length, i ++) {
readFile();
writeFile();
}
Promise.all(promises).then(function(){
console.log('ALL DONE!');
// Do something
});
这是结果
全部完成!
阅读文件
写文件
阅读文件
写文件
阅读文件
写文件
我的代码肯定有问题。 “All Done”应该是最后一次登录。有人可以指导我吗?
答案 0 :(得分:2)
从getJSON
来电中返回的数据肯定不是承诺。在promisejs站点(https://www.promisejs.org/)中,您可以使用以下命令将jQuery promise转换为Promise对象:
var jQueryPromise = $.ajax('/data.json');
var realPromise = Promise.resolve(jQueryPromise);
您的示例中的内容如下所示:
var promises = [];
var myArray = //something
function readFile(){
return Promise.resolve($.getJSON( "yyy.com/readfile?callback", function( data ) {
console.log('Reading File');
}));
}
function writeFile(){
return Promise.resolve($.getJSON( "yyy.com/writefile?callback", function( data ) {
console.log('Writing File');
}));
}
for(var i, i < myArray.length, i ++) {
promises.push(readFile());
promises.push(writeFile());
}
Promise.all(promises).then(function(){
console.log('ALL DONE!');
// Do something
});
评论更新:
如果您希望按顺序处理您的承诺,则应使用.then
,例如:
for(var i, i < myArray.length, i ++) {
var operationPromise = readFile().then(function(readFileResponse){
return writeFile(readFileResponse);
});
promises.push(operationPromise);
}
答案 1 :(得分:0)
这是因为当您致电Promise.all(promises)
时,promises
仍为空(来自上方)。 $.getJSON
是异步的,这意味着它会偏向一边并运行它。
时间表:
promises = [];
Promise.all(promises)
被调用,promises
仍为空。$.getJSON
应返回并添加到promises
变量。此外,我非常确定您未正确使用承诺,但我对他们的了解不够充分。