gpt4 book ai didi

在循环中工作时的 JavaScript 回调函数

转载 作者:行者123 更新时间:2023-11-30 16:19:24 25 4
gpt4 key购买 nike

这是下面代码的作用:

  • 转到数据库中的表并检索我将发送到 Google API 的一些搜索条件(PHP 文件是 getSearchSon.php)

  • 得到结果后,我想循环它,调用 Google API (searchCriteriasFuc) 并将结果存储在数组中

  • 代码的最后一部分是使用 Google API (updateSearchDb.php) 返回的结果对两个不同的表进行更新

在我的代码中,我在一些我不喜欢的场合使用了 setTimeout。而不是使用 setTimeout,我想以更有效的方式正确使用回调函数(这可能是我的问题的原因)我这样做的最佳方式是什么?

$(document).ready(function() {


$.ajax({

url: 'getSearchSon.php',

type: 'POST',

async: true,

dataType: 'Text',

/*data: { }, */

error: function(a, b, c) { alert(a+b+c); }

}).done(function(data) {


if(data != "connection")
{
var dataSent = data.split("|");

var search_criterias = JSON.parse(dataSent[0]);

var date_length = dataSent[1];

var divison_factor = dataSent[2];

var length = search_criterias.length;

var arrXhr = [];

var totalResultsArr = [];

var helperFunc = function(arrayIndex)
{
return function()
{
var totalResults = 0;

if (arrXhr[arrayIndex].readyState === 4 && arrXhr[arrayIndex].status == 200)
{
totalResults = JSON.parse(arrXhr[arrayIndex].responseText).queries.nextPage[0].totalResults;

totalResultsArr.push(totalResults);
}
}
}

var searchCriteriasFuc = function getTotalResults(searchParam, callback)
{
var searchParamLength = searchParam.length;

var url = "";

for(var i=0;i<searchParamLength;i++)
{
url = "https://www.googleapis.com/customsearch/v1?q=" + searchParam[i] + "&cx=005894674626506192190:j1zrf-as6vg&key=AIzaSyCanPMUPsyt3mXQd2GOhMZgD4l472jcDNM&dateRestrict=" + date_length;

arrXhr[i] = new XMLHttpRequest();

arrXhr[i].open("GET", url, true);

arrXhr[i].send();

arrXhr[i].onreadystatechange = helperFunc(i);
}

setTimeout(function()
{
if (typeof callback == "function") callback.apply(totalResultsArr);
}, 4000);


return searchParam;
}

function callbackFunction()
{
var results_arr = this.sort();

var countResultsArr = JSON.stringify(results_arr);

$.ajax({

url: 'updateSearchDb.php',

type: 'POST',

async: true,

dataType: 'Text',

data: { 'countResultsArr': countResultsArr },

error: function(a, b, c) { alert(a+b+c); }

}).done(function(data) {

var resultsDiv = document.getElementById("search");

if(data == "NORECORD") resultsDiv.innerHTML = 'Updated failed. There was a problem with the database';

else resultsDiv.innerHTML = 'Update was successful';

}); //end second ajax call
}

//llamando funcion principal
var arrSearchCriterias = searchCriteriasFuc(search_criterias, callbackFunction);

}
else
{
alert("Problem with MySQL connection.");
}

}); // end ajax

});

最佳答案

2015年你是怎么做到的

回调已成为过去。现在,您使用 Promise 表示异步任务的结果值。这是一些未经测试的代码:

$(document).ready(function() {
$.ajax({
url: 'getSearchSon.php',
type: 'POST',
async: true,
dataType: 'text'
/*data: { }, */
}).then(function(data) {
if (data == 'connection') {
alert("Problem with MySQL connection.");
} else {
var dataSent = data.split("|");
var search_criterias = JSON.parse(dataSent[0]);
var date_length = dataSent[1];
var divison_factor = dataSent[2];

return Promise.all(search_criterias.map(function(criteria) {
return $.ajax({
url: "https://www.googleapis.com/customsearch/v1"
+ "?q=" + criteria
+ "&cx=005894674626506192190:j1zrf-as6vg"
+ "&key=AIzaSyCanPMUPsyt3mXQd2GOhMZgD4l472jcDNM"
+ "&dateRestrict=" + date_length,
type: 'GET'
});
})).then(function(totalResultsArr) {
totalResultsArr.sort();
var countResultsArr = JSON.stringify(totalResultsArr);

return $.ajax({
url: 'updateSearchDb.php',
type: 'POST',
async: true,
dataType: 'text',
data: { 'countResultsArr': countResultsArr },
error: function(a, b, c) { alert(a+b+c); }
});
}).then(function(data) {
var resultsDiv = document.getElementById("search");
if(data == "NORECORD") {
resultsDiv.innerHTML = 'Updated failed. There was a problem with the database';
} else {
resultsDiv.innerHTML = 'Update was successful';
}
});
}
}).then(null, function() {
alert('Some unexpected error occured: ' + e);
});
});

这就是你在 2016 年(ES7)中的做法

你可以只使用 async/await。

$(document).ready(async() => {
try {
var data = await $.ajax({
url: 'getSearchSon.php',
type: 'POST',
async: true,
dataType: 'text'
/*data: { }, */
});
if (data == 'connection') {
alert("Problem with MySQL connection.");
} else {
var dataSent = data.split("|");
var search_criterias = JSON.parse(dataSent[0]);
var date_length = dataSent[1];
var divison_factor = dataSent[2];

var totalResultsArr = await Promise.all(
search_criterias.map(criteria => $.ajax({
url: "https://www.googleapis.com/customsearch/v1"
+ "?q=" + criteria
+ "&cx=005894674626506192190:j1zrf-as6vg"
+ "&key=AIzaSyCanPMUPsyt3mXQd2GOhMZgD4l472jcDNM"
+ "&dateRestrict=" + date_length,
type: 'GET'
}))
);

totalResultsArr.sort();
var countResultsArr = JSON.stringify(totalResultsArr);
var data2 = await $.ajax({
url: 'updateSearchDb.php',
type: 'POST',
async: true,
dataType: 'text',
data: { 'countResultsArr': countResultsArr },
error: function(a, b, c) { alert(a+b+c); }
});
if(data2 == "NORECORD") {
resultsDiv.innerHTML = 'Updated failed. There was a problem with the database';
} else {
resultsDiv.innerHTML = 'Update was successful';
}
}
} catch(e) {
alert('Some unexpected error occured: ' + e);
}
});

2016 年更新

不幸的是,async/await 提案最终没有进入 ES7 规范,因此它仍然是非标准的。

关于在循环中工作时的 JavaScript 回调函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34965783/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com