使用简单示例了解Javascript回调

时间:2014-06-13 11:53:24

标签: javascript callback

我正在玩Facebook SDK。我的目标是在玩这个例子时学习更多Javascript。 我学习的方式是通过完成自己的任务,当我完成它时,我学会了它:)

包含Facebook SDK的代码已启动并正在运行,此处未包含此代码。我的问题不是针对Facebook API,它只是一个例子。我试图通过回调这个常见问题扩展我的Javascript知识

我无法完成一项任务,我认为它与回调有关... 任务: 单击包含以下代码的按钮:

<button id="askme" onclick='askFaceBook();'>Direct</button>

该代码将运行以下函数:

  function askFaceBook() {
         var result = myApi.getLoggedName("Samsung");
     };

反过来会运行myApi对象:

var myApi = {
         getLoggedName: function (statement) {
             return FB.api('/me', function(response) {

                 console.log(response);
                 return response + "" + statement;
             });
         }
     }

问题: 变量结果始终未定义。它在myAPI.getLoggedName返回之前执行。 myAPI按预期工作如何使变量结果等待结果。我知道我可以使用promises / deffered,但我想了解并学习如何使用回调来实现Javascript样式。

我希望有人可以帮助我:)

2 个答案:

答案 0 :(得分:2)

当您呼叫myApi.getLoggedName()并将其结果值分配给result时,该值将立即被激活。但是,由于api调用是异步的,因此返回值为undefined。因此,您需要在异步调用完成后分配值。一种方法是使用回调函数,如下所示:

var myApi = {
  getLoggedName: function(statement, callback) {
    FB.api('/me', function(response) {
      if(typeof callback === "function") {
        callback(response);
      }
    });
  }
}
function askFaceBook() {
  var result;
  myApi.getLoggedName("samsung", function(response) {
    result = response;
    console.log(result); // => actual result
  });
  console.log(result); // => undefined, because async hasn't finished yet!
}

答案 1 :(得分:2)

首先,myApi.getLoggedName

中的return语句出错了

函数FB.api正在取两个参数,其中第二个是你的回调引用,并且在回调中没有使用return语句,因为没有人期望回调的返回值。因此,当您调用FB.api时,它只会注册该回调(在响应上执行)并且不返回任何内容,因此您的函数myApi.getLoggedName返回undefined。

现在如何解决这个问题

在这种情况下,我们可以使用像

这样的Promise
var myApi = {
    getLoggedName: function (statement) {
       var promise = new Promise(function(resolve, reject) {
            FB.api('/me', function(response) {
                console.log(response);
                resolve(response + "" + statement);
            });
       }).then(function(result) {
           return result;
       });
    }
 }

现在在这种情况下,当resolve被调用时,将执行then lock,并将结果作为参数传递给然后回调。我的这种情况结果不会被定义。