Promisejs不准确,$getJSON在循环中

Promisejs not accurate, $getJSON in loop

本文关键字:循环 getJSON 不准确 Promisejs      更新时间:2023-09-26

我在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);
}

这是因为当您调用Promise.all(promises)时,promises仍然是空的(从上面来看)。$.getJSON是异步的,这意味着它将转到一边并运行它

时间表:

  1. promises = [];
  2. 定义了readFile和writeFile
  3. readFile和writeFile被称为一堆,然后转到一边
  4. Promise.all(promises)被调用,并且promises仍然是空的
  5. 因为承诺没有任何作用,所以它会立即返回
  6. 大约在这个时候,$.getJSON s应该返回并添加到promises变量中

此外,我很确定你使用的承诺是错误的,但我对它们的了解不够,无法证实。