Promisejs不准确,$getJSON在循环中
Promisejs not accurate, $getJSON in loop
我在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
是异步的,这意味着它将转到一边并运行它
时间表:
promises = [];
- 定义了readFile和writeFile
- readFile和writeFile被称为一堆,然后转到一边
Promise.all(promises)
被调用,并且promises
仍然是空的- 因为承诺没有任何作用,所以它会立即返回
- 大约在这个时候,
$.getJSON
s应该返回并添加到promises
变量中
此外,我很确定你使用的承诺是错误的,但我对它们的了解不够,无法证实。
相关文章:
- $.每个jquery循环打印一个“;未定义的“;对于getJSON请求后的每个元素,网格数据都会完美地打印出来
- 使用$.getJSON循环遍历数组
- Jquery将循环变量绑定到getJSON函数
- 如何在循环期间访问 jquery getJson 调用 ($.getJson) 中的索引变量
- 使来自 GetJson 数组的循环数据成为链接
- 在输出数据之前,等待循环完成每个数组项的 $.getJSON
- $.getJSON() 在 $.each() 循环中的调用未按顺序执行
- while循环中的getJSON
- Promisejs不准确,$getJSON在循环中
- javascript/jQuery getJSON非常慢,有一个内循环
- Getjson和.each()函数.需要搜索/循环在第二层
- 美元.getJSON for循环在本地
- 使用getjson方法动态地从json中获取数据并循环这些值
- 在一个for循环中有多个. getjson
- 美元.getJSON with for循环,仅在调试时工作
- 在多个.each循环中存储来自. getjson的多个对象
- 如何启动$.使用For循环多次getJSON
- 如何循环通过最后.使用getJSON获取fm结果
- $getJSON和for循环问题
- 使用getJSON函数从while循环读取数据