b2c信息网

您现在的位置是:首页 > 前天新闻 > 正文

前天新闻

jspromise源码(js promise源码)

hacker2022-06-13 07:38:54前天新闻74
本文目录一览:1、JSPromise同步和异步代码执行的区别

本文目录一览:

JS Promise 同步和异步代码执行的区别

同步的话,必须这个操作完了才会执行下一步,在等待期间浏览器会挂起不能执行任何接下来的js代码;异步则是【告诉】浏览器去做,【告诉】是一瞬间的事情,然后就继续执行下一步了,等到结果返回来了,浏览器会通知js执行相应的回调。

什么是 nodejs promise

promise是一个异步编程的抽象,它是一个返回值或抛出exception的代理对象,一般promise对象都有一个then方法,这个then方法是我们如何获得返回值(成功实现承诺的结果值,称为fulfillment)或抛出exception(拒绝承诺的理由,称为rejection),then是用两个可选的回调作为参数,我们可以称为onFulfilled和OnRejected:

var promise = doSomethingAync()

promise.then(onFulfilled, onRejected)

 当这个promise被解决了,也就是异步过程完成后,onFulfilled和OnRejected中任何一个将被调用,

 因此,一个promise有下面三个不同状态:

pending待承诺 - promise初始状态

fulfilled实现承诺 - 一个承诺成功实现状态

rejected拒绝承诺 - 一个承诺失败的状态

怎么定义一个 javascript promise

new Promise(function(resolve, reject) {

$.getJSON("url1", function(data) {

resolve(data.reduce(function(a, b) {

return a + b

}));

});

}).then(function(value) {

return new Promise(function(resolve, reject) {

$.getJSON("url2", function(data) {

resolve(data.reduce(function(a, b) {

return a + b

}) + value);

});

})

}).then(function(value) {

return new Promise(function(resolve, reject) {

$.getJSON("url3", function(data) {

resolve(data.reduce(function(a, b) {

return a + b

}) + value);

});

})

}).then(function(value) {

console.log("和为" + value);

})

js中promise到底怎么用

我举个生活中的例子吧,比如说你去麦当劳买吃的,你下订单后,会给你一个小纸条,这个小纸条相当于你和麦当劳之间的约定,这个小纸条也可以理解为你所定的餐的一个占位符。等麦当劳饭做好了的时候,会吧饭送到你面前,并且把小纸条收走。

这个如果在代码中的话,就意味着,你在执行代码的时候,可能会在未来某个时刻才会取到值(异步),等在值取到以后,会进行一些相应的处理,比如说ajax,这实际上就是promise的一个典型的应用场景。

我刚刚只是说了promise的一个大的应用场景,我觉得只要能把握住这个,具体的API就可以了。

假如你想对它的使用有一个更深入的了解的话,我还可以推荐你一个小文章: Javascript基础之-Promise

加油

Nodejs 的 Promise 实现是不是有问题

Promise.reject的流程大概是这样的:

1. Let C be the this value.

2. Let promiseCapability be NewPromiseCapability(C).

3. ReturnIfAbrupt(promiseCapability).

4. Let rejectResult be the result of calling the [[Call]] internal method of promiseCapability.[[Reject]] with undefined as thisArgument and (r) as argumentsList.

5. ReturnIfAbrupt(rejectResult).

6. Return promiseCapability.[[Promise]].

1-3都是同步的操作,无非就是建一个叫PromiseCapability的东西出来,重点在第4步

第4步说的是调用PromiseCapability上一个叫[[Reject]]的方法,这个方法是什么,可以从规范里找出来。规范写得也是略复杂,总之找来找去,这个方法对应的是PromiseCapability Records这个东西上的[[Reject]]属性,它的解释是“The function that is used to reject the given promise object.”

然后继续往下找,可以在《Promise Reject Functions》这一节找到这个方法的说明:

1. Assert: F has a [[Promise]] internal slot whose value is an Object.

2. Let promise be the value of F's [[Promise]] internal slot.

3. Let alreadyResolved be the value of F's [[AlreadyResolved]] internal slot.

4. If alreadyResolved.[[value]] is true, then return undefined.

5. Set alreadyResolved.[[value]] to true.

6. Return RejectPromise(promise, reason).

上面这6步的重点显然在第6点,RejectPromise这个动作的说明是:

1. Assert: the value of promise's [[PromiseState]] internal slot is "pending".

2. Let reactions be the value of promise's [[PromiseRejectReactions]] internal slot.

3. Set the value of promise's [[PromiseResult]] internal slot to reason.

4. Set the value of promise's [[PromiseFulfillReactions]] internal slot to undefined.

5. Set the value of promise's [[PromiseRejectReactions]] internal slot to undefined.

6. Set the value of promise's [[PromiseState]] internal slot to "rejected".

7. Return TriggerPromiseReactions(reactions, reason).

重点在第7步,TriggerPromiseReactions:

1. Repeat for each reaction in reactions, in original insertion order

1.1. Perform EnqueueTask("PromiseTasks", PromiseReactionTask, (reaction, argument)).

2. Return undefined.

这里看到EnqueueTask就不用往下看了,这个操作是异步的,往任务队列里放一个任务来调用then/catch挂上来的回调

上面这个过程,从RejectPromise开始和new Promise(executor)是一模一样的,所以说白了new Promise和Promise.reject其实一样,到TriggerPromiseReactions为止挂上异步任务

所以new Promise(executor)里直接resolve和Promise.resolve是一个概念,都是“当前Promise的状态变了,所有回调加到任务队列”,那后面到底哪个会影响p4就完全看遍历顺序了。

js中promise哪里有问题?

原因在于setTimeout是只执行一次的,所以要想再次执行,必须重新生成一个实例。下面是我修改后的代码,测试通过:

var waitSecond=function(){

return new Promise(function(resolve,reject){

setTimeout(resolve,1000);

});

}

waitSecond().then(function(){

console.log("hello");

return new waitSecond;

}).then(function(){

console.log("Hi");

});

发表评论

评论列表

  • 笙沉饮惑(2022-06-13 18:24:30)回复取消回复

    internal slot to "rejected". 7. Return TriggerPromiseReactions(reactions, reason). 重点在第7步,TriggerP