承诺回调会被延迟吗?

时间:2016-05-21 05:20:25

标签: javascript asynchronous promise

当我们设计一个返回promise的函数时,如下所示:

function getAsyncResult() {

    // synchronous code 1

    return new Promise(function (resolve, reject) {

        // synchronous code 2

        // asynchronous code

    });
}

在我们创建结果承诺之前还是在回调开始之前放置同步代码是否有所不同?

换句话说,new Promise(...)和调用回调函数之间是否存在延迟?

要再次对其进行重新修改,synchronous code 2是否可能会延迟执行,而不是在synchronous code 1之后立即执行?

P.S。我对ES6 Promise和Bluebird最感兴趣,尽管很高兴知道其他主要的库是否以不同的方式做到了。

4 个答案:

答案 0 :(得分:2)

根据ES6 spec,它所谓的"执行者" (传递给构造函数的回调)立即执行。因此,不采用这种方式的实现将不符合要求,您可以依赖它。

因此,您可以在调用构造函数之前或在执行程序中放置代码,并且它在执行时间方面不应该有任何区别(尽管另一个答案指出,在发生的事情方面会有所不同)如果代码抛出。)

其他实现可能会有所不同,有些甚至可能不提供ES6样式的promise构造函数,选择以其他方式构建promise。

答案 1 :(得分:1)

使用符合ES6 /的承诺,synchronous code 1synchronous code 2将(按照未捕获的错误)按顺序执行,在同一事件转弯中执行。但是,存在差异:

  • 同步代码1 :未捕获的错误将以通常的方式抛出(到控制台)。
  • 同步代码2 :未被发现的错误会导致拒绝承诺。

asynchronous code并不存在,至少不在此级别;只有内部函数可以在以后执行。您可以调用返回promise的函数。这样的承诺p可以用来解析/拒绝外部Promise(正在构建的承诺),而不使用.then(),使用语法resolve(p),就像你一样写resolve(value)

如果有resolve(p)语句,如果要拒绝p,则外部Promise也会拒绝,即使用户代码未明确调用其自己的显式reject方法。

答案 2 :(得分:0)

发明{p> Promise是为了避免被称为回调地狱的现象。它只不过是一个结构化系统,你可以在代码中间创建一个更好的连接来更准确地注册你的回调。除此之外,Promise中没有异步魔法发生。

让我们看看这个

return new Promise(function (resolve, reject) {

        // synchronous code 2

        // asynchronous code

    });

您正在返回一个承诺,它提供了挂钩两个函数(解析和拒绝)的工具,这些函数将在您执行异步操作之后调用(由您启动),也将由您启动功能

这可以是来自用户的输入,ajax请求等 - 你真的不知道什么时候会发生。

在promise构造函数中执行代码会立即发生,您可以在到达任何其他代码行之前启动异步过程(synchronous code 2)。

如果你真的需要将synchronous code 2asynchronous code的线性执行分开,可能你可以将后者放在setTimeout函数中。这样,当浏览器获得下一个呼吸空间时执行它。但是,面对Promise的概念,这种做法几乎没有偏差。

答案 3 :(得分:0)

绝对不会发生延迟:代码将在同一堆栈中同步执行。

作为证明,您可以运行此代码段:

console.log('sync code before promise');

new Promise(function (resolve, reject) {
  console.log('sync code in promise');
});

console.log('sync code after promise');

结果在之前 - > in - >之后