Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript jQuery.when().then()承诺不遵守内部for循环_Javascript_Jquery_.when - Fatal编程技术网

Javascript jQuery.when().then()承诺不遵守内部for循环

Javascript jQuery.when().then()承诺不遵守内部for循环,javascript,jquery,.when,Javascript,Jquery,.when,我使用for循环遍历一个基本JSON对象。JSON看起来像: { "1": { "project_name": "Example Project Name 1", "client_name": "John Doe" }, "2": { "project_name": "Example Project Name 2", "client_name": "John Doe" }, /// ------- } 我遇到的问题是当循环通过它时。我尝试使

我使用for循环遍历一个基本JSON对象。JSON看起来像:

{
  "1": {
    "project_name": "Example Project Name 1",
    "client_name": "John Doe"
  },
  "2": {
    "project_name": "Example Project Name  2",
    "client_name": "John Doe"
  },
  /// -------
}
我遇到的问题是当循环通过它时。我尝试使用.when和.then循环使用ajax调用,正如预期的那样同步进行,但所述ajax的输入始终是JSON的最后一个索引

显然,我认为这是错误的,因为def=def.then函数{直接在for循环中,它将保持它直到返回满意为止。我只是不明白为什么我错了,解决方案是什么!我如何正确地将项目与脚本的其余部分同步传递到prepareLayerproject?我知道我的逻辑有缺陷,我只是无法通过树看到森林

为了便于解释结果,这里是console.log的样子-蓝色区域是立即发生的,其余区域是def.then函数{


您可能希望在跟踪单个任务进度的同时使用jQuery。另外请注意,现代浏览器根本不需要jQuery,您所做的一切都已经有了简单的JS API:

const apidendpoint=`/app/ajax/calls/process_project.php`; constyourdata={……}; const dataKeys=Object.keysyourData; const progressBar=新的增量ProgressBarDataKeys.length; /** *你经常在同一个地方发帖:让我们把它变成一个函数。 */ 函数postDatadata={}{ 返回fetchapident{ 方法:`POST`, 标题:{ 内容类型:`application/json` }, 正文:JSON.stringifydata }; } /** *把{yourData,key}变成发布数据的承诺。 */ 功能键topromiseKey{ 返回新的PromiseSolve,拒绝=>{ const data=yourData[key]; postDatadata .thenresult=>{ 增量; 解决结果; } .catcherror=>{ 增量{错误:`${key}失败`}; 拒绝错误; }; }; } //而现在我们只是…经历了所有的事情 许诺 .alldataKeys.mapkeyToPromise .thenresult=>moveOnWhenDone .catcherror=>handleException;
您可能希望在跟踪单个任务进度的同时使用jQuery。另外请注意,现代浏览器根本不需要jQuery,您所做的一切都已经有了简单的JS API:

const apidendpoint=`/app/ajax/calls/process_project.php`; constyourdata={……}; const dataKeys=Object.keysyourData; const progressBar=新的增量ProgressBarDataKeys.length; /** *你经常在同一个地方发帖:让我们把它变成一个函数。 */ 函数postDatadata={}{ 返回fetchapident{ 方法:`POST`, 标题:{ 内容类型:`application/json` }, 正文:JSON.stringifydata }; } /** *把{yourData,key}变成发布数据的承诺。 */ 功能键topromiseKey{ 返回新的PromiseSolve,拒绝=>{ const data=yourData[key]; postDatadata .thenresult=>{ 增量; 解决结果; } .catcherror=>{ 增量{错误:`${key}失败`}; 拒绝错误; }; }; } //而现在我们只是…经历了所有的事情 许诺 .alldataKeys.mapkeyToPromise .thenresult=>moveOnWhenDone .catcherror=>handleException;
这里有三种方法可以做到这一点,不同级别的并行化

要逐个上载并逐个处理,请执行以下操作:

const bulkUpload=asyncarr,processResponse=identity=>{ 让艾尔进来吧{ const response=等待上传 等待进程响应响应 } } bulkUploadprojects.values,processResponse。然后。。。 要并行上传并在收到所有回复后逐个处理,请执行以下操作:

const bulkUpload=asyncarr=>wait Promise.allsettedarr.mappupload bulkUploadprojects.values.thenallResponses=>/*处理响应*/ 要并行上载并处理每个响应,请执行以下操作:

const uploadAndProcess=el=>uploadel.thenprocessResponse const bulkUpload=asyncarr=>wait Promise.allsettedarr.mapuploadAndProcess bulkUploadprojects.values 样板:

const projects={1:{project_name:P1,client_name:C1},2:{project_name:P2,client_name:C2},} 常量标识=x=>x cont URL='/app/ajax/calls/process_project.php' const upload=item=>fetchURL,requestoptions项目 const requestOptions=project=>{method:'POST',headers:{'Content Type':'application/json'},body:json.stringify{project}
这里有三种方法可以做到这一点,不同级别的并行化

要逐个上载并逐个处理,请执行以下操作:

const bulkUpload=asyncarr,processResponse=identity=>{ 让艾尔进来吧{ const response=等待上传 等待进程响应响应 } } bulkUploadprojects.values,processResponse。然后。。。 要并行上传并处理一个接一个,一旦我们有了所有的响应 es:

const bulkUpload=asyncarr=>wait Promise.allsettedarr.mappupload bulkUploadprojects.values.thenallResponses=>/*处理响应*/ 要并行上载并处理每个响应,请执行以下操作:

const uploadAndProcess=el=>uploadel.thenprocessResponse const bulkUpload=asyncarr=>wait Promise.allsettedarr.mapuploadAndProcess bulkUploadprojects.values 样板:

const projects={1:{project_name:P1,client_name:C1},2:{project_name:P2,client_name:C2},} 常量标识=x=>x cont URL='/app/ajax/calls/process_project.php' const upload=item=>fetchURL,requestoptions项目 const requestOptions=project=>{method:'POST',headers:{'Content Type':'application/json'},body:json.stringify{project}
也许可以原谅这个愚蠢的问题,但是为什么你不使用呢?你可以使用@Mike not silly。。我有一个进度条,我正在创建并运行它。。当我研究Promise_时,它看起来不太现实,所以我采用了这种方法。我基本上取100,除以索引数,每次迭代都会增加进度条的宽度。Promise_是否可以按照Moz上描述的方式实现这一点?请使用async-await.Sure,Promise.all简单地接受一系列承诺,并且在所有这些承诺完成之前不会自行解决。因此,您可以自由地让这些承诺中的每一个在resolve或reject上调用对进度条的更新:new PromiseSolve,reject=>{doblah.thene=>{updateProgressBartrue;resolve;}.Catch=>{updateProgressBarfalse;reject;}因此,每次承诺达成时,您都可以增加进度条,然后您以100%的速度实现承诺。所有[…].那么你的代码可能会原谅这个愚蠢的问题,但是为什么你不使用呢?你可以使用@Mike not Dully。.我有一个进度条,我正在创建并运行它。.当我查看Promise\u所有内容时,它看起来不太实际,所以我使用这种方法。我基本上取100,除以索引数和e每次迭代都会增加我的进度条的宽度。Promise_是否可能像Moz上描述的那样?使用async-await.Sure,Promise.all只接受一组承诺,在所有承诺都完成之前不会自行解决。因此,您可以让每个承诺在解决时调用进度条的更新或者拒绝:newpromiseresolve,reject=>{doblah.thene=>{updateprogressbarrue;resolve;}.catch=>{updateProgressBarfalse;reject;}所以每次承诺解决时,您都可以增加进度条,然后您100%地这样做就是承诺。所有[…]。然后你的代码在这里我不知道承诺。所有人都有这么多的灵活性。。感谢你的澄清!我们也可以使用async和Wait重写此代码,因为这些都是承诺的语法糖。我不知道承诺。所有人都有这么多的灵活性。。感谢你的澄清!我们也可以使用async和Wait重写此代码,si这些都是围绕承诺的语法糖。
function bulkUploadGo() {
    var def = $.when();

    for (var i = 1; i < Object.keys(projects_json).length + 1; i++) {
        var project = Object(projects_json)[i];

        // THIS WILL LOOP INSTANTLY -- SO I WILL SEE 1 - X INSTANTLY
        console.log(project); 

        def = def.then(function () {

             // THIS DISPLAYS SYNCHRONOUSLY, BUT IS ALWAYS SET TO THE LAST INDEX BECAUSE OF INSTANT LOOP ABOVE
            console.log(project); 

            return prepareLayer(project);
        });
    }
}

function prepareLayer(project) {
    return $.ajax({
        type: "POST",
        url: "/app/ajax/calls/process_project.php",
        dataType: 'html',
        data: {project: project}
    }).then(function (data) {
        var obj = JSON.parse(data); 
        // Do stuff
    });
}