jspromise源码(js promise源码)
本文目录一览:
- 1、JS Promise 同步和异步代码执行的区别
- 2、什么是 nodejs promise
- 3、怎么定义一个 javascript promise
- 4、js中promise到底怎么用
- 5、Nodejs 的 Promise 实现是不是有问题
- 6、js中promise哪里有问题?
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");
});