0

我是 javascript 编程的新手。我只是找不到有效的答案。

问题是我的函数仅在它包含在 setTimeout 调用中时才有效,如下所示:

var sPageIdentifier = 'ReportViewer';
UserPreferencesManager.Initialize(sPageIdentifier);
setTimeout(function () {
var strUserPrefs = UserPreferencesManager.GetPreferences();
    console.log(strUserPrefs);
   initLayout(strUserPrefs);
}, 1000);

function initLayout(strUserPrefs) {
    //do stuff using strUserPrefs
}

如果我注释掉 setTimeout 函数,则 initLayout(strUserPrefs) 将失败,因为 strUserPrefs 为空。任何帮助将不胜感激!

这是 UserPreferencesManager.js 代码:

var UserPreferencesManager = function () {
  var strPrefsID = null;
  var strPrefsString = null;

  return {

    Initialize: function (strPrefsIDIn) {
      strPrefsID = strPrefsIDIn;
      strPrefsString = this.GetPreferences();
    },

    GetPreferences: function () {
      if (!strPrefsID) {
        alert("Validation Failed: the UserPreferencesManager must be initialized prior to usage.");
        return null;
      }
      if (!strPrefsString) {
        this.LoadPreferences();
        return strPrefsString;
      }
      return strPrefsString;
    },
    LoadPreferences: function () {
      if (!strPrefsID) {
        alert("Validation Failed: the UserPreferencesManager must be initialized prior to usage.");
        return null;
      }    
      myasyncfunctioncall({
        parameters: ["USR_PersonId", "abc", 'GET']
        script_name: 'MAINTAIN_USER_PREFS',
        onexception: function (exception, xhr, options) {
          alert('Error: ' + xhr.statusText + +exception);
          console.log(exception);
        },
        onsuccess: function (data, xhr, options) {
          if (data == "User ID is zero") {
            alert('MP_MAINTAIN_USER_PREFS: must be > 0.0');
            strPrefsString = data;
          }
          else {
            strPrefsString = data;
          }
        }
      });
    },// end of LoadPreferences

    WritePreferences: function (strPrefsIn, strPrefsID) {
      if (strPrefsID && typeof strPrefsID === "string") {
        if (strPrefsIn != null) {

          myasyncfunctioncall({
            parameters: ["USR_PersonId", strPrefsID, strPrefsIn , 'SET']
            script_name: 'MAINTAIN_USER_PREFS',
            onexception: function (exception, xhr, options) {
              alert('Error: ' + xhr.statusText + +exception);
              console.log(exception);
            },
            onsuccess: function (data, xhr, options) {
              if (data == "transaction-ok") {
                UserPreferencesManager.LoadPreferences();
              } else if (data == "User ID is zero") {
                alert('MP_MAINTAIN_USER_PREFS: must be > 0.0');
              }
            }
          });
        } else {
          alert("Error: Preferences object must be initialized prior to writing preferences");
        }
      } else {
        alert('Error: The preference ID can\'t be null and must to be of type string');
        return;
      }
    }// end of WritePreferences
  };// end of return API

}(); // end of UserPreferencesManager
4

3 回答 3

0

像这样的 myasyncfunctioncall 正在发送异步请求。如果此异步请求的响应已经到达,您需要添加一些变量来设置,然后,当它设置好后,您可以继续您的例程。

无论何时在 javascript 上进行异步调用,程序都会继续执行,就好像它已经完成一样。您必须手动添加检查以查看它是否已完成。

于 2013-07-11T17:26:00.753 回答
0

UserPreferencesManager.GetPreferences() 正在进行异步 AJAX 调用以获取用户首选项。因此,在这种情况下,Javascript 线程将在当前线程上下文中继续执行并执行 initLayout(strUserPrefs)。但在这种状态下,GetPreferences() 调用仍未完成,并且 strUserPrefs 为空。

SetTimeout 是克服这个问题的技巧之一,你做到了。但是您也可以将 API 设计为允许为每个异步 AJAX 调用执行回调函数。

于 2013-07-11T17:28:43.780 回答
0

谢谢你的小费,巴拉钱德拉!这是我所做的,向 LoadPreferences 方法添加了两个参数 - 回调和 strPrefsID,因此我可以在成功时调用 fnCallback 函数并将其传递给 ajax 数据:

LoadPreferences: function (fnCallback, strPrefsID) {
    if (!strPrefsID) {
        alert("Validation Failed: the BhsUserPreferencesManager must be initialized prior to usage.");
        return null;
    }
    if (strPrefsString) {
        // strPrefsString is not null, so return it
        callback(strPrefsString);
    } else {
        myasyncfunctioncall({
            parameters: ["USR_PersonId", "abc", 'GET']
            script_name: 'MAINTAIN_USER_PREFS',
            onexception: function (exception, xhr, options) {
                alert('Error: ' + xhr.statusText + +exception);
                console.log(exception);
            },
            onsuccess: function (data, xhr, options) {
                if (data == "User ID is zero") {
                    alert('MAINTAIN_USER_PREFS: must be > 0.0');
                    strPrefsString = data;
                } else if (data.substring(0, 5) === "ERROR") {
                    alert(data);
                } else {
                    fnCallback(data);
                }
            }
        });
    }
}// end of LoadPreferences

下面是我现在如何调用 initLayout:

BhsUserPreferencesManager.LoadPreferences(initLayout, sPageIdentifier);
于 2013-07-12T13:09:46.073 回答