我有以下JavaScript模式。我正在尝试仅在“ getDataOne”完成后才运行“ getDataTwo”。这意味着XMLHttpRequest必须返回所有数据。我一直在四处寻找信息。关于回调,超时和承诺。而且我不理解答案,或者解释不符合我的特定代码模式(并且我无法理解答案)。
当我做:
getDataOne(getDataTwo());
我得到的结果与上面不一致,因为XMLHttpRequest在下一个开始之前尚未启动。因此,每个人都尝试彼此或多或少地相互协作。
当我尝试这样的事情:
this.getDataOne(function(){
this.getDataTwo();
});
这是对回调的微不足道的尝试(我认为),只有一个函数倾向于运行。
所以-我的问题-仅当从“ getDataOne”调用完成了整个“ processRequest”后,如何才能可靠地运行“ getDataTwo”?
请注意,我不希望使用计时器样式的功能(例如,仅在3秒钟后运行)。因为,谁要说那根特定的弦子有多长。
这是代码模式:
this.getDataOne = function() {
myURL = this.returnURL();
var xrRW = new XMLHttpRequest();
this.processRequest(apiGSS, xrRW, myURL);
} // end: getDataOne
this.getDataTwo = function() {
myURL = this.returnURL();
var xrRW = new XMLHttpRequest();
this.processRequest(apiGSS, xrRW, myURL);
} // end: getDataTwo()
this.processRequest = function(iAPI, xReq, strCommand) {
xReq.onreadystatechange = function() {
if (xReq.readyState === 4) {
if (xReq.status === 200) {
// parse JSON data...
Do JSON work here
// write parsed data to screen...
// by calling a function and sending it the parsed JSON data
writeToScreen(arrayofJSONData());
} // end: xReq.readyState === 200
} // end: xReq.readyState === 4
} // end: onreadystatechange
xReq.open("GET", strCommand, true);
xReq.send(null);
} // end: processRequest
最佳答案
原来我的代码很奇怪。这是针对我的情况的解决方法(感谢回答的人,结果证明我分享的信息不足以帮助您了解我的全部情况)。
我现在正在成功使用此调用模式:“ getDataOne(getDataTwo());” (不带引号)。我在'getDataOne'和'getDataTwo'函数中所做的不同之处在于,我没有在单个数组中设置变量(抱歉,原始代码中未显示)。因此,当调用getDataOne时,它正在写入getDataTwo所依赖的同一数组,并且进一步,returnURL和processRequest正在检查同一单个数组以了解它们各自必须执行的逻辑。由于“最后一个更新阵列的命令将获胜”,因此整个代码将失败。这是我的代码现在正在做的事情的一个更好的共享,并且做得很好,因为它不尝试读取被竞争函数争夺的单个数组(是):
getDataOne(getDataTwo());
this.getDataOne = function() {
myURL = this.returnURL("byOne type", "byOne query");
this.processRequest(apiGSS, xrRW, myURL, "byOne Type");
} // end: getDataOne
this.getDataTwo = function() {
myURL = this.returnURL("byTwo type", "byTwo query");
this.processRequest(apiGSS, myURL "byTwo type");
} // end: getDataTwo()
this.returnURL( byType, byQuery ) {
// return a URL that matches the byType and byQuery requirements
}
this.processRequest = function(iAPI, strCommand, byType) {
var xReq = new XMLHttpRequest();
xReq.onreadystatechange = function() {
if (xReq.readyState === 4) {
if (xReq.status === 200) {
if (byType === "byTwo type") {
// do this...
} else {
// do that...
} // end: (byType === "byTwo type" )
} // end: xReq.readyState === 200
} // end: xReq.readyState === 4
} // end: onreadystatechange
xReq.open("GET", strCommand, true);
xReq.send(null);
} // end: processRequest