在运行时环境中如何处理JavaScript承诺

时间:2019-06-15 19:03:42

标签: javascript promise

我正在尝试弄清在运行时环境中如何处理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();

1 个答案:

答案 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()处理程序传递了一个表示拒绝原因的参数。