我在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/

10-10 11:17