我正在尝试弄清在运行时环境中如何处理Promise。是否将它们移到Web API容器中直到解决,然后在调用.then时将其推入调用栈中?这是一些示例代码。 Console.log在承诺之前运行,这使我相信它们最终进入队列的某个位置。我还注意到我可以在.then中放置一个函数,然后返回的promise将填充该函数的参数。
// asynchronous test
let promiseWhatever = new Promise( function(resolve, reject){
// variable to be chained later and passed in function argument
let chainedVariable = 'I am chained';
resolve(chainedVariable);
reject('rejected promise');
});
let promiseMe = function(promiseResult) {
let message = `${promiseResult} to my computer`;
return Promise.resolve(message);
// resolves here to be passed onto the second chained then
};
function hello() {
promiseWhatever
.then(promiseMe)
// how does promiseMe take in the result for its argument?
// then returns another promise and you can chain them
.then( function(fulfilled){
console.log(fulfilled);
}) // is fullfilling the code to display the string to the console.
.catch( function(err) {
console.log(err);
});
console.log('hello'); // logs first to the console
};
hello();
答案 0 :(得分:0)
首先,诺言只是一种通知方案。底层异步操作(无论代码解析还是拒绝了promise)通常在Javascript之外(使用本机代码),例如传入的webSocket消息或ajax响应或类似的东西。
所有诺言引擎都使用事件队列。兑现承诺后,他们会将事件发布到事件队列中,以触发适当的.then()
或.catch()
处理程序。语言或Promise规范不是必需的,但是许多实现将特殊的事件队列用于Promise回调,并与其他类型的事件队列一起进行检查。
promise规范要求.then()
或.catch()
处理程序必须在当前事件循环代码完成后始终异步调用,即使立即解决了Promise。因此,您的console.log('hello')
在console.log()
处理程序中的.then()
之前显示。这是设计使然,目的是为了在promise调用其处理程序时(始终在当前事件循环代码完成之后)建立一致性。
它们是否已移入Web API容器,直到它们解析,然后在调用.then时被推入调用堆栈中?
在解决了诺言后,会将事件插入事件队列,这将导致在当前事件循环代码完成之后(在以后的事件循环周期中)调用适当的.then()
回调。
您不清楚“ Web API容器”是什么意思,因此我无法对此发表评论。
我还注意到我可以将一个函数放在.then中,然后返回的promise将填充该函数参数
是的,这就是诺言的工作方式。 .then()
处理程序传递了一个参数,该参数表示promise的已解决值。 .catch()
处理程序传递了一个表示拒绝原因的参数。