创建已解决的A +承诺

时间:2014-09-13 09:48:40

标签: javascript promise

这是一个非常深奥的问题。

编写接受单个值并返回符合条件的Promises/A+的函数的简单方法是什么,该函数立即用提供的值解析。我想在不使用现有库的情况下执行此操作。

我想我已经明白了,但规格非常具体,我觉得我可能错过了什么。我也很想知道是否有更好的方法来做到这一点。

基本上,以下内容是否符合A + / Promises规范以创建已解决的承诺。

var resolvedPromise = (function() {
  function makePromise(isRejected, value) {
    var promise1;

    promise1 = {
      then: function(onFulfilled, onRejected) {
        var callback, promise2;

        promise2 = promise1;

        callback = isRejected ? onRejected : onFulfilled;

        if (typeof callback === 'function') {
          try {
            promise2 = callback(value);
          }
          catch (ex) {
            promise2 = makePromise(true, ex);
          }
        }

        if (promise2 == null || typeof promise2.then !== 'function') {
          promise2 = makePromise(false, promise2);
        }

        return promise2;
      }
    }

    return promise1;
  }

  return makePromise.bind(null, false);
})();

1 个答案:

答案 0 :(得分:1)

  

编写函数的简单方法是什么,它接受单个值并返回一个符合规定的Promises / A +,它会立即用提供的值解析。我想在不使用现有库的情况下执行此操作。

没有。基本上,在不使用现有库的情况下创建符合Promises / A +的承诺意味着您必须编写自己的兼容库;这是一项非常重要的任务。

  

规范非常具体,我觉得我可能错过了一些东西。

Promises / A +规范只是关于Promise的.then方法应该如何工作,以及库应该如何处理具有then方法但不是自己的Promise类型实例的对象。

规范没有说明如何或通过什么方法创建Promise对象,也没有说明如何解决它。

  

我想我已经明白了

不,您的then方法违反了规范中的几点;最具体的是#2.2.4:

  在执行之前,不得调用

onFulfilledonRejected   上下文堆栈仅包含平台代码。

     

此处“平台代码”表示引擎,环境和承诺   实施代码。在实践中,这个要求确保了这一点   在事件发生后,onFulfilledonRejected 异步执行   循环转入,其中调用then,并使用新堆栈。这可以   使用“{1}}或”setTimeout等“宏任务”机制实现   setImmediate,或者使用“微任务”机制   MutationObserverprocess.nextTick。自承诺实施以来   被认为是平台代码,它本身可能包含任务调度   队列或“trampoline”,其中称为处理程序

此外,除了执行它们异步所产生的主要合规(即使承诺已经解决)并且仍然立即返回结果的承诺,您当前的代码不遵循承诺解决方案详细信息,只需立即使用then方法返回所有对象,即使它们不符合要求。

  

我也很想知道是否有更好的方法。

使用现有的库: - )