我的理论可能有点弱,问这个,所以请随时告诉我。
此代码是使用Kango framework的浏览器插件的一部分。基本上我有代码生成一个用户ID的随机字符串。我还有另一个功能,可以设置一个大型的JSON。它看起来像这样:
function createJSON() {
data = {};
data["userID"] = generateID();
}
function generateID() {
kango.invokeAsync('kango.storage.getItem', 'userID', function(data) {
uid = data;
if (!uid) {
console.log("uid doesn't exist, creating uid!");
kango.invokeAsync('kango.storage.setItem', userID, function(data) { return data; });
} else {
console.log("uid found!: " + uid);
return uid;
}
return data;
});
}
kango.invokeAsync docs are here。我的理解是它有点像异步ajax调用,从这个意义上来说,当我试图将其值分配给数据[“userID”]时,它并没有及时返回。
我想我可以通过首先执行userID调用然后使用它的回调(这里的术语有点含糊)来解决这个问题,然后继续添加到数据数组中。
我不知道这是否是正确的方法。如何返回异步函数以使用?
答案 0 :(得分:3)
从documentation开始更加接近调用异步示例。
在您的代码中,invokeAsync
和kango.storage.setItem
调用有两个错误:
// 1. Second argument should be string 'item name'
// 2. Third argument should be 'item value'
kango.invokeAsync('kango.storage.setItem', userID, function(data) { callback(data); });
您应该以{{1}}方式使用kango.storage.setItem:
invokeAsync
所以,结果代码将是这样的:
kango.invokeAsync('kango.storage.setItem', 'userID', '123');
答案 1 :(得分:2)
由于generateID()的异步特性,你不能这样做。它将在异步调用完成之前返回,因此数据不可用:
data["userID"] = generateID();
相反,你必须使用这样的回调:
generateID(function(val) {data["userID"] = val;});
function generateID(callback) {
kango.invokeAsync('kango.storage.getItem', 'userID', function(data) {
uid = data;
if (!uid) {
console.log("uid doesn't exist, creating uid!");
kango.invokeAsync('kango.storage.setItem', userID, function(data) { callback(data); });
} else {
console.log("uid found!: " + uid);
callback(uid);
}
});
}
使用异步功能时,不能使用正常的顺序编程。相反,您必须在完成回调中继续执行流程,因为只有assent函数的结果才会知道。
因此,您将无法调用createJSON()
并从中返回所需的值。如果createJSON()
之后的任何代码需要结果,那么它也必须在回调中。
答案 2 :(得分:1)
function createJSON() {
data = {};
generateID(function(id) {
data["userID"] = id;
});
}
function generateID(callback) {
kango.invokeAsync('kango.storage.getItem', 'userID', function(data) {
uid = data;
if (!uid) {
console.log("uid doesn't exist, creating uid!");
kango.invokeAsync('kango.storage.setItem', userID, function(data) { callback(data); });
} else {
console.log("uid found!: " + uid);
callback(uid);
}
callback(data);
});
}
这对你有用吗?
答案 3 :(得分:1)
您无法从异步调用返回对象。而是创建另一个函数并将回调对象传递给它。
// some code
if (!uid) {
console.log("uid doesn't exist, creating uid!");
kango.invokeAsync('kango.storage.setItem', userID, function(data) {
getData(data);
});
} else {
console.log("uid found!: " + uid);
getData(uid);
}
function getData(data) {
// Use data here.
}