我有以下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

10-02 15:38