在JavaScript中执行then()函数

时间:2018-01-08 01:46:03

标签: javascript asynchronous promise

我是异步JavaScript的新手,在学习JavaScript中的Promise时,我写了一个简单的程序

remove()

输出是:

var p=new Promise(function(resolve,reject)
{
  //Any async task.
  var IsPromiseFulfilled=true;

  if(IsPromiseFulfilled){
    resolve("Promise Fulfilled");
  }
  else
  {
    reject("Promise Rejected");
  }
});

p.then(function(status){
  console.log(status);
}).catch(function(status){
  console.log(status);
});

console.log("End Of Program");

任何人都可以告诉我为什么"程序结束"早于#34; Promise Fulfilled"

5 个答案:

答案 0 :(得分:2)

因为它是在你的承诺之外执行的,而是在承诺解决之前执行。

虽然indexOf调用速度不慢,但它会处理所有代码,然后开始解析承诺。

值得注意的是,通过使用以下承诺,您可以缩短一些事情:

Promise.resolve().then()

我发现这种格式比使用Promise.resolve().then(result => { // do something with your result }).catch(error => { // do something with your error. });

更容易

答案 1 :(得分:1)

p。然后发生在将来。当节点等待然后解决它的承诺时,它将执行下一行代码。

这是console.log(“程序结束”);

答案 2 :(得分:1)

它的工作原理是因为promise specification中描述了.then()处理程序的方式。

所有.then()处理程序都在事件循环的未来标记处执行。这意味着任何同步代码在任何.then()处理程序之前执行,即使承诺立即得到解决。

这是一个非常简单的例子:

console.log("a");
Promise.resolve().then(() => {console.log("b");});
console.log("c");

这将输出:

 a
 c
 b

这是按照promise规范进行的,它以这种方式完成,以保证.then()处理程序始终是异步的,因此具有一致且可预测的行为,无论承诺是立即解决还是将来某个时间解决。它使编写和测试代码变得更加简单。

来自Promises A+ specification

  

2.2.4 onFulfilled或onRejected在执行上下文堆栈仅包含平台代码之前不得调用。 [3.1]。

"平台代码"这意味着当前Javascript的执行完成,然后当堆栈完全没有任何Javascript时,那么只有那时才会调用promises .then()个处理程序。

因此,在上面的示例中,promise立即得到解决,并且.then()处理程序立即被调度,但它被安排在其余的同步代码完成后运行(基本上是在下一轮事件循环)。

在ES6规范中,当promise解析时,其.then()处理程序将使用enqueJob()进行调度。 ES6中的工作概念被描述为here。这里的相关内容是它们在当前正在执行的Javascript完成之后运行。

答案 3 :(得分:1)

如果您想以线性方式执行Promisesasync功能,则必须使用

  

ES2017 async/await语法

异步函数中的任何Promise都可以使用语法await,因为您不必使用.then().catch()

(async function () {
    try {
        var status = await p()

        console.log(status)
        console.log("End Of Program")
    } catch (e) {
        console.log(e) //If p reject, you catch it here
    }

})()

你应该像这样写Promise

var p = new Promise(function(resolve,reject) {
    /*  When you use asynchronous functions, they all have a callback
        This callback may have some error and data params, so,
        you use them to resolve or reject your promise
    */
    someAsyncFunction('blabla', function(error, data) {
        if (error)
            reject(error)
        else 
            resolve(data)
    })
})

答案 4 :(得分:0)

我没有假装学术答案,但我已经问过amost the same question  今天,关于承诺。

Actuall答案是:

  

当你要求在JS工作时,说什么,“好吧,这需要一些时间,但我保证在工作完成后我会告诉你。所以请相信我的保证,一旦工作完成,我会告诉你的,“它会立即给你一个承诺。

这就是你看到你的原因:

End Of Program
Promise Fullfilled

实际方案如下:

   │
   ├┐
   │↓ promise
   ↓
console.log