Promisejs不准确,$ getJSON循环

时间:2014-10-07 17:54:42

标签: javascript jquery for-loop promise getjson

我正在使用带有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”应该是最后一次登录。有人可以指导我吗?

2 个答案:

答案 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是异步的,这意味着它会偏向一边并运行它。

时间表:

  1. promises = [];
  2. 定义了readFile和writeFile
  3. readFile和writeFile被称为一堆,并转到一边。
  4. Promise.all(promises)被调用,promises仍为空。
  5. 因为承诺没有任何关系,所以它会立即返回。
  6. 大约在这段时间内,$.getJSON应返回并添加到promises变量。
  7. 此外,我非常确定您未正确使用承诺,但我对他们的了解不够充分。