js找到控件后再下一步操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js找到控件后再下一步操作相关的知识,希望对你有一定的参考价值。

参考技术A 一、同步和异步

所谓单线程,无非就是同步队列和异步队列,js代码是自上向下执行的,在主线程中立即执行的就是同步任务,比如简单的逻辑操作及函数,而异步任务不会立马立马执行,会挪步放到到异步队列中,比如ajax、promise、事件、计时器等等。

也就是先执行同步,主线程结束后再按照异步的顺序再次执行。

二、时间循环(Event Loop)

Event Loop是什么?中文翻译是事件循环,等待主线程中任务全部完成后,再回来把异步队列中任务放到主程序中运行,这样反复的循环,就是事件循环。

b14d903a712b31c34f347ba7d64b697e.png
先来看组代码

console.log('开始111'); setTimeout(function () console.log('setTimeout111'); , 0); Promise.resolve().then(function () console.log('promise111'); ).then(function () console.log('promise222'); ); console.log('开始222');
打印 “开始111”,再打印“开始222”。
中途的三个异步,进入到了异步队列,等待同步执行完(打印完),返回来再执行异步,所以是后打印出来。
打印的结果先放一放,我们稍后回来再说。现在我们中途插播一段知识点:

三、宏观任务和微观任务(先执行微观任务,再执行宏观任务):

在事件循环中,每进行一次循环操作称为tick,tick 的任务处理模型是比较复杂的,里边有两个词:分别是 Macro Task (宏任务)和 Micro Task(微任务)。

简单来说:

宏观任务主要包含:setTimeout、setInterval、script(整体代码)、I/O、UI 交互事件、setImmediate(Node.js 环境)

微观任务主要包括:Promise、MutaionObserver、process.nextTick(Node.js 环境)

规范:先执行微观任务,再执行宏观任务

那么我们知道了,Promise 属于微观任务, setTimeout、setInterval 属于宏观任务,先执行微观任务,等微观任务执行完,再执行宏观任务。所以我们再看一下这个代码:

console.log('开始111'); setTimeout(function () console.log('setTimeout111'); , 0); Promise.resolve().then(function () console.log('promise111'); ).then(function () console.log('promise222'); ); console.log('开始222');
我们按照步骤来分析下:

1、遇到同步任务,直接先打印 “开始111”。
2、遇到异步 setTimeout ,先放到队列中等待执行。
3、遇到了 Promise ,放到等待队列中。
4、遇到同步任务,直接打印 “开始222”。
5、同步执行完,返回执行队列中的代码,从上往下执行,发现有宏观任务 setTimeout 和微观任务 Promise ,那么先执行微观任务,再执行宏观任务。

所以打印的顺序为:开始111 、开始222 、 promise111 、 promise222 、 setTimeout111 。

同理,我们再来分析一个代码:

console.log('开始111');setTimeout(function () console.log('timeout111'););new Promise(resolve => console.log('promise111'); resolve(); setTimeout(() => console.log('timeout222'));).then(function () console.log('promise222'))console.log('开始222');
分析一下:

1、遇到同步代码,先打印 “开始111” 。
2、遇到setTimeout异步,放入队列,等待执行 。
3、中途遇到Promise函数,函数直接执行,打印 “promise111”。
4、遇到setTimeout ,属于异步,放入队列,等待执行。
5、遇到Promise的then等待成功返回,异步,放入队列。
6、遇到同步,打印 “开始222”。
7、执行完,返回,将异步队列中的代码,按顺序执行。有一个微观任务,then后的,所以打印 “promise222”,再执行两个宏观任务 “timeout111” “timeout222”。

所以,打印的顺序为:开始111 、 promise111 、 开始222 、 promise222 、 timeout111 、 timeout222 .

先执行主任务,把异步任务放入循环队列当中,等待主任务执行完,再执行队列中的异步任务。异步任务先执行微观任务,再执行宏观任务。一直这样循环,反复执行,就是事件循环机制。

等待完成后再执行下一步

【中文标题】等待完成后再执行下一步【英文标题】:Wait for completion before executing next step 【发布时间】:2015-02-26 21:47:08 【问题描述】:

我有几个流程需要在我的 TableView 加载时按顺序完成。我希望它会等到代码完成后再执行下一行代码,但似乎情况并非如此。有没有办法让这些等到完成后再执行下一步?

override func viewDidLoad() 
    super.viewDidLoad()

performTask1()

performTask2()

performTask3()

感谢大家的帮助!

【问题讨论】:

它确实会等待,除非这些任务中的任何一个分派代码块以在后台执行,您是否在做类似的事情? 是的,有办法做到这一点(通过阻塞主线程)。但不,你不想那样做。流程完成后,只需重新加载/显示您的表格视图。 是的,我正在解析“FindObjectInBackground”。所以如果它是在后台的东西,它会启动它,然后把它交还给原来的功能?每个过程都依赖于另一个过程。我想我可以在前一个过程结束时开始下一个过程,但这对我来说似乎不太干净。 【参考方案1】:

使这些方法中的每一个都采用completionHandler参数的典型示例,例如:

func perform1(completionHandler: () -> Void) 
    doSomethingAsynchronously() 
        completionHandler()
    


func perform2(completionHandler: () -> Void) 
    doSomethingElseAsynchronously() 
        completionHandler()
    


func perform3(completionHandler: () -> Void) 
    doSomethingCompletelyDifferentAsynchronously() 
        completionHandler()
    

然后你可以像这样运行它们:

override func viewDidLoad() 
    super.viewDidLoad()

    perform1 
        self.perform2 
            self.perform3 

            
        
    

【讨论】:

感谢大家的帮助。我将努力创建完成处理程序。 谢谢,@Rob。这看起来很有趣,我试图对其进行测试,但在 Xcode 7.3、Swift 2.2 中出现错误 "Argument passed to call that takes no arguments"。关于如何解决这个问题的任何建议?错误图片:i.imgur.com/CiwJBay.png @user4806509 - 您的 doSomethingAsynchronouslydoSomethingElseAsynchronouslydoSomethingCompletelyDifferentAsynchronously 方法没有完成处理程序。为他们提供在异步任务完成时调用的完成处理程序闭包(就像您为 perform1perform2perform3 所做的那样)。见gist.github.com/robertmryan/9f00acd8faec99b6da1c9300dddf7fdc。 非常感谢@Rob。

以上是关于js找到控件后再下一步操作的主要内容,如果未能解决你的问题,请参考以下文章

git的使用

等待元素加载出来后再执行下一步的方法

js 上一步 下一步 操作

怎么安装MyEclipse

Centos6.9虚拟机安装

winform 如何实现上一步下一步