我正在玩 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 风格。
我希望有人能帮助我:)
最佳答案
首先,myApi.getLoggedName 中的 return 语句有什么问题
FB.api 函数采用两个参数,其中第二个参数是您的回调引用,并且在回调中没有使用 return 语句,因为没有人期望回调返回值。因此,当您调用 FB.api 时,它只是注册该回调(在响应中执行)并且不返回任何内容,因此您的函数 myApi.getLoggedName 返回未定义。
现在如何解决这个问题
在这种情况下,我们可以使用 Promises,例如
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 锁,并将结果作为参数传递给 then 回调。在这种情况下,结果不会是未定义的。
关于javascript - 使用简单示例了解 Javascript 回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24204696/