鍍金池/ 問(wèn)答/HTML5  HTML/ js異步方法如何改為同步方法

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

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

  return result;
};

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

回答
編輯回答
蟲(chóng)児飛

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

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

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

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

1.回調(diào)方式

export const getUserToken = (cb) => {
  setupWebViewJavascriptBridge((bridge) => {
    bridge.callHandler('fetchUserInfo', (data) => {
      // 這里通過(guò)回調(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)識(shí),表示里面是異步
    const data = await getUserToken()
    console.log(data )
}
2017年11月9日 17:07
編輯回答
陌上花

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

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

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

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

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

2018年5月16日 20:39