我是异步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"
答案 0 :(得分:2)
因为它是在你的承诺之外执行的,而是在承诺解决之前执行。
虽然indexOf
调用速度不慢,但它会处理所有代码,然后开始解析承诺。
值得注意的是,通过使用以下承诺,您可以缩短一些事情:
Promise.resolve().then()
我发现这种格式比使用Promise.resolve().then(result => {
// do something with your result
}).catch(error => {
// do something with your error.
});
答案 1 :(得分:1)
这是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()
处理程序始终是异步的,因此具有一致且可预测的行为,无论承诺是立即解决还是将来某个时间解决。它使编写和测试代码变得更加简单。
2.2.4 onFulfilled或onRejected在执行上下文堆栈仅包含平台代码之前不得调用。 [3.1]。
"平台代码"这意味着当前Javascript的执行完成,然后当堆栈完全没有任何Javascript时,那么只有那时才会调用promises .then()
个处理程序。
因此,在上面的示例中,promise立即得到解决,并且.then()
处理程序立即被调度,但它被安排在其余的同步代码完成后运行(基本上是在下一轮事件循环)。
在ES6规范中,当promise解析时,其.then()
处理程序将使用enqueJob()
进行调度。 ES6中的工作概念被描述为here。这里的相关内容是它们在当前正在执行的Javascript完成之后运行。
答案 3 :(得分:1)
如果您想以线性方式执行Promises
和async
功能,则必须使用
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