我正在玩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样式。
我希望有人可以帮助我:)
答案 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。
现在如何解决这个问题
在这种情况下,我们可以使用像
这样的Promisevar 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,并将结果作为参数传递给然后回调。我的这种情况结果不会被定义。