承诺意外行为,执行顺序

时间:2017-06-28 08:21:45

标签: javascript promise es6-promise

在将Chrome升级到58之前,我没有错误。

进一步说明:我的代码正在星期天工作,我不知道执行的异步性,两天后发现了这个!

private void insertTaak_Clicked(object sender, EventArgs e)
{
    var navPage = new DetailTaak("0") { Title = "Taak toevoegen" };

    var app = Application.Current as App;

    var mainPage = (MenuPage)app.MainPage;


    mainPage.Detail = new NavigationPageBar(navPage);
}

输出:

  

1

     

2

     

4

     

3

1-为什么'然后'在console.log之后执行(2)???

可能答案:因为承诺结果在正文返回后执行

2-为什么'然后'在console.log之后执行(4)???

2 个答案:

答案 0 :(得分:1)

由于promises的异步性质,then处理程序将存储在事件循环的消息队列中。只要JavaScript运行时的调用堆栈为空,就会处理此队列的元素。在您的场景中,需要运行console.log(4);才能将封闭函数从调用堆栈中取出,此时JavaScript引擎可以开始处理消息队列中的项目(假设封闭函数是顶级函数) ),导致在then内运行代码。

答案 1 :(得分:0)

Thank you @PatrickRoberts for providing a reference:

Promise自然是ASYNC,并在下一个事件循环执行时执行。