然后需要使用诺言异步等待

时间:2018-12-21 02:30:53

标签: javascript react-native ecmascript-6 async-await es6-promise

如何基本异步正确等待?我已经为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代码转换为异步等待状态。

3 个答案:

答案 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)
}