0

我是来自 Java 和 Objective C 背景的 Javascript 编程新手。我正在寻找更多关于混合移动应用程序的 Javascript 的知识。

在这样做时,我试图通过回调进行登录,但我在理解语法和回调的工作方式时遇到了一些麻烦。

首先,我正在调用以下登录函数,它只是创建一个 ajax 调用以在分钟获取一些 JSON 以进行测试:

testLogin.loginWithUsername ("test", loginCallback);

这可以正常工作,因为我可以在日志中看到 200 OK 状态和预期的 JSON。

然而,回调“loginCallBack”永远不会被调用。

如下:

loginCallback: {
success: function(id) {
    alert ('success');
}
failure: function (id, error) {
    alert ('failure');
}
}

首先,当我尝试在 success:function(id) 行运行代码时,上面给出了一个语法错误。我可以将它和失败函数更改为 = function(id),然后代码运行,但永远不会调用回调。

我正在为登录使用一个库,该库表明所需的回调是一个需要成功和失败函数的对象,上面的代码是给定的示例。

所以首先我不明白为什么上面的语法在示例代码中有效,但在我运行它时却给了我一个错误?

其次,我是否正确调用了回调?loginWithUsername 调用和 loginCallback 函数都在同一个 Login.js 文件中。

4

2 回答 2

1

以下是回调如何工作的示例:

第一件事:您需要创建一个包含您的函数/方法的新对象。属性和方法以逗号分隔列出。

// Creating new object with callback functions
var loginCallback = {
  success: function(id) {
    alert ('success');
  } , // Add a comma
  failure: function (id, error) {
      alert ('failure');
  }
}

function loginWithUsername(username, callback) {
  if (username === 'test') {
    var successId = 1;
    callback.success(successId);
  } else {
    var errorId, errorMsg;
    errorId = 0;
    errorMsg = 'Error';
    callback.failure(errorId, errorMsg);   
  }
}

现在您可以调用该函数:

loginWithUsername('test', loginCallback);

结果应该是“成功”。

编辑:但是你可以在没有对象的情况下通过直接传递函数来做到这一点:

// Creating function
function showMessage(message) {
  alert(message);
}

function loginWithUsername(username, callback) {
  if (username === 'test') {
    callback('success');
  } else {
    callback('failure');   
  }
}

// Pass function
loginWithUsername('test', showMessage); // Result: 'success'
loginWithUsername('abcd', showMessage); // Result: 'failure'
于 2013-10-31T12:37:43.407 回答
1

首先,当我尝试在 success:function(id) 行运行代码时,上面给出了一个语法错误。

对象字面量中的每个属性:值对必须用逗号分隔。

}, /* Your comma is missing which is why you get a syntax error */
failure:

这个:

loginCallback: {

仅当您想在对象文字中定义属性时才可接受。

这个:

testLogin.loginWithUsername ("test", loginCallback);

正在使用变量。

你可能想要:

var loginCallback = {

但是如果没有更多的上下文就很难说。

于 2013-10-31T12:21:30.300 回答