我在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
});
这是结果
全做完了!
读取文件
写文件
读取文件
写文件
读取文件
写文件
我的代码一定有问题。最后应记录“所有完成”。有人可以指导我吗?
最佳答案
从您的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);
}
关于javascript - Promise.js不准确,$ getJSON循环,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26242143/