JavascriptKango:如何在非异步函数中获取异步JS函数的返回
JavascriptKango: How to get a return of an async JS function inside a non-async function?
我的理论可能有点弱,所以请随时告诉我。
此代码是使用 Kango 框架的浏览器插件的一部分。基本上,我有代码可以生成一个随机字符串,即用户ID。我还有另一个函数可以设置一个大的 ole 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 在这里。我的理解是它的工作方式有点像异步 ajax 调用,从这个意义上说,当我尝试将其值分配给 data["userID"] 时,它不会及时返回。
我想我可以通过先执行 userID 调用然后使用它的回调(这里的术语有点模糊)来继续添加到数据数组来解决这个问题。
我不知道这是否是正确的方法。如何返回要使用的异步函数?
请更仔细地查看文档中的调用异步示例。
在你的代码中,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); });
您应该通过以下方式将 kango.storage.setItem 与invokeAsync
一起使用:
kango.invokeAsync('kango.storage.setItem', 'userID', '123');
因此,结果代码将如下所示:
function generateID(callback) {
kango.invokeAsync('kango.storage.getItem', 'userID', function(uid) {
if(!uid) {
kango.console.log("uid doesn't exist, creating uid!");
uid = '123'; // TODO: replace with your ID generation algorithm
kango.invokeAsync('kango.storage.setItem', 'userID', uid);
}
else {
kango.console.log("uid found!: " + uid);
}
callback(uid);
});
}
data = {};
generateID(function(uid) {
data["userID"] = uid;
});
由于 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);
}
});
}
使用异步函数时,不能使用正常的顺序编程。 相反,您必须在完成回调中继续执行流,因为只有这样,异步函数的结果才已知。
因此,您将无法调用createJSON()
并从中返回所需的值。 如果 createJSON()
之后的任何代码需要结果,它也必须在回调中。
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);
});
}
这对你有用吗?
不能从异步调用返回对象。而是创建另一个函数并将回调对象传递给它。
// 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.
}
相关文章:
- 如何在异步函数中使用javascript对象
- 调用后不异步Ajax忽略函数
- javascript函数中的异步与同步.(Node.js)
- Meteor:异步函数回调异常:onAfterAction
- 从框架中的函数异步加载 Javascript
- 为什么在定义回调/侦听器函数(异步消息传递,port.on)后没有立即设置全局变量
- 将javascript变量传输到插件函数(异步URL)
- 如何从 JavaScript 调用 JQuery 函数(异步调用后)
- 与其他变换函数异步制作不透明度动画
- 两个异步模块函数异步工作
- durandal激活函数异步代码
- 无法使我的示例函数异步
- 当内部函数异步执行某些操作时,如何从外部函数的回调返回值
- Javascript -使函数异步
- 如何使这个同步递归函数异步
- Promise.then()但函数异步运行
- 使用setimeout使命名函数异步化
- Javascript esriRequest (dojo)在函数异步问题
- 返回嵌套函数(异步)
- 我如何使这个JS函数异步