Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.3k views
in Technique[技术] by (71.8m points)

关于js异步的问题

  1. 是否一般的函数执行就可以说是阻塞的,同步执行的?比如:
const sync = function() {
  let a = 1
  let b = 2
  let c = 3
}

也即是说,在这3行赋值语句执行完成之前,函数外所有的语句执行都是停滞的?

  1. 如果一个函数形似:
const sync2 = async function() {
  var a = 0
  a = await a_return_promise_function()// return 1
  return a 
}

现在需要在一个事件触发函数event中调用sync2,想要实现效果:
a. 在event中阻塞,保证event函数会按顺序执行,对event的返回值不做处理,不阻塞event外部。最好是把event改为async event,调用写成await sync2()吗?(在此期间用户仍可执行其他动作?)
是否在调用含有返回promise对象的函数时,将当前函数设为async是最佳做法?

event: async function() {
  ...
  a = await sync2()
  ...
}

b. sync2会返回一个promise,那么如何改写或包装sync2,使得sync2异步返回a的值而不是promise对象?

event: function() {
  ...
  var a = 0
  a = new_sync2()
  console.log(a)// will be 0
  ...
}

c. sync2会返回一个promise,那么如何改写或包装sync2,使得sync2会同步执行,也就是效果等同于上文函数sync的执行?(在此期间用户不可执行其他动作?)
如果我想做到:

1. 像普通同步函数一样执行
2. 不阻塞外部执行

是否是无法做到的?

event: function() {
  ...
  var a = 0
  a = new_sync2()
  console.log(a)// will be 1
  ...
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

a.就这样写
b.

event: function() {
  ...
  var a = 0
  sync2().then((resultData)=>{
     a = resultData;   
     console.log('resultData:',resultData);
     console.log(a);
  });
  ...
}

c.不能


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...