在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/HTML5  HTML/ js異步方法如何改為同步方法

js異步方法如何改為同步方法

export const getUserToken = () => {
  let result = '';
  
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler('fetchUserInfo', (data) => {
      // 這一步是異步的,想請教改為同步的怎么寫
      result = data;
    });
  });

  return result;
};

這是一段h5和iOS交互的方法,就是調(diào)用一個iOS方法,iOS返回一個參數(shù)回來,iOS的返回是用回調(diào)方法里返回的,調(diào)用這個方法還沒等給result復(fù)制就直接返回默認(rèn)的空字符串了,求各位大神指導(dǎo)怎么寫才能返回正常取到的結(jié)果呢?

回答
編輯回答
蟲児飛

把調(diào)用函數(shù)與回調(diào)函數(shù)分開寫,在window下注冊回調(diào)函數(shù),讓app去調(diào)用,這樣就可以拿到回調(diào)結(jié)果了。

2017年4月26日 05:19
編輯回答
只愛你

改成同步會有很大的性能問題,比如在你等待的那幾秒鐘頁面完全卡死,做不了任何事。

根據(jù)你的需求,你需要改成回調(diào)的方式,把需要處理的事件傳遞進來,而不是想著把result返回出去,如果一定要返回,可能要用到那些async/await,看你的環(huán)境支不支持了

1.回調(diào)方式

export const getUserToken = (cb) => {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler('fetchUserInfo', (data) => {
      // 這里通過回調(diào)函數(shù)處理
      cb && cb(data)
    });
  });
};

//調(diào)用方式

getUserToken(fucntion(data){
    console.log(data)
    //這樣就可以打印出dada
})

2.async/await方式

export const getUserToken = () => new Promise((resolve, reject) => {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler('fetchUserInfo', (data) => {
      resolve(data)
    })
  })
})

// 用法:

async function(){ //注意`await`外層函數(shù)需要有`data `標(biāo)識,表示里面是異步
    const data = await getUserToken()
    console.log(data )
}
2017年11月9日 17:07
編輯回答
陌上花

改成同步是很難實現(xiàn)了,JS本身就是一個異步事件流的特性。
安心用回調(diào)吧,如果你的環(huán)境支持的話,倒是可以選擇使用async/await來使代碼看起來像同步的:

export const getUserToken = () => new Promise((resolve, reject) => {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler('fetchUserInfo', (data) => {
      // 這一步是異步的,想請教改為同步的怎么寫
      resolve(data)
    })
  })
})

// 用法:
await getUserToken() // 就能拿到結(jié)果了

// 拋開await以后是這樣的
getUserToken().then(data => {
  // 在這里拿到結(jié)果
})

可以參考之前寫過的一篇關(guān)于async的筆記:https://segmentfault.com/a/11...

2018年5月16日 20:39