如何基本异步正确等待?我已经为AsyncStorage创建了一个帮助程序,该帮助程序会自动等待异步,但是它的用户是否还必须使用func flattenDeep(args []interface{}, v interface{}) []interface{} {
if s, ok := v.([]interface{}); ok {
for _, v := range s {
args = flattenDeep(args, v)
}
} else {
args = append(args, v)
}
return args
}
func AcceptsAnything(v ...interface{}) {
args := flattenDeep(nil, v)
fmt.Println(args)
}
或promise方法来获取价值?
此代码有效,但无法正确使用语法。
这是我的代码:
var still_fetching = false;
//fetch data every 3 seconds (3000)
setInterval(function(){
if (still_fetching) {
return;
}
still_fetching = true;
loadUsers();
}, 3000);
//need to update a bit this function
function loadUsers(){
var xhr = new XMLHttpRequest();
xhr.open('GET', 'users.php', true);
xhr.onload = function(){
if(this.status == 200){
var users = JSON.parse(this.responseText);
var output = '';
for(var i in users){
output += '<ul>' +
'<li>ID: ' +users[i].id+'</li>' +
'<li>Name: ' +users[i].name +'</li>' +
'</ul>';
}
document.getElementById('users').innerHTML = output;
still_fetching = false;
}
}
xhr.send();
}
如何根据我要导航到不同位置的结果,将async await
代码转换为异步等待状态。
答案 0 :(得分:1)
异步功能和承诺返回功能可以以相同的方式在外部使用。
AsyncStorageHelper.getItem("logins")
.then(result => {
if (result) {
if (result === "1") {
navigate(SCREEN1);
} else {
navigate(SCREEN2);
}
}
})
.catch(err => {
navigate(LOGINSCREEN);
});
与:
// note: this code must run in another async function
// so we can use the keyword await
try {
const result = await AsyncStorageHelper.getItem("logins");
if (result) {
if (result === "1") {
navigate(SCREEN1);
} else {
navigate(SCREEN2);
}
}
} catch (err) {
navigate(LOGINSCREEN);
}
注意:您的代码具有未知的代码路径。当AsyncStorageHelper.getItem("logins")
返回一个伪造的值时会发生什么?您本质上是没有睡,这可能不是您想要的行为。
答案 1 :(得分:1)
await必须在异步函数中使用。
async function helper() {
try {
const result = await AsyncStorageHelper.getItem("logins");
if (result) {
if (result === "1") {
navigate(SCREEN1);
} else {
navigate(SCREEN2);
}
}
} catch (error) {
navigate(LOGINSCREEN);
}
}
helper()
答案 2 :(得分:0)
class AsyncStorageHelper {
static async getItem(key : string) {
let value: any = ""
try {
value = await AsyncStorage.getItem(key)
} catch (error) {
console.log(`Error item: ${value}`)
throw new Error(`Error ${value}`)
}
return value
}
}
try {
const result = await AsyncStorageHelper.getItem("logins")
if (result)
(result === "1") ? navigate(SCREEN1): navigate(SCREEN2)
} catch(err) {
navigate(LOGINSCREEN)
}