Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建已解析的a+;允诺_Javascript_Promise - Fatal编程技术网

Javascript 创建已解析的a+;允诺

Javascript 创建已解析的a+;允诺,javascript,promise,Javascript,Promise,这是一个相当深奥的问题 编写函数的简单方法是什么?它接受一个值并返回一个兼容的值,该值立即用提供的值解析。我希望在不使用现有库的情况下执行此操作 我想我已经弄明白了,但是规格非常具体,我觉得我可能遗漏了什么。我也想知道是否有更好的方法 本质上,以下内容是否符合创建已解决承诺的A+/Promises规范 var resolvedPromise = (function() { function makePromise(isRejected, value) { var promise1;

这是一个相当深奥的问题

编写函数的简单方法是什么?它接受一个值并返回一个兼容的值,该值立即用提供的值解析。我希望在不使用现有库的情况下执行此操作

我想我已经弄明白了,但是规格非常具体,我觉得我可能遗漏了什么。我也想知道是否有更好的方法

本质上,以下内容是否符合创建已解决承诺的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);
})();
编写一个函数的简单方法是什么,它接受一个值并返回一个兼容的承诺/a+,该承诺立即用提供的值解析。我希望在不使用现有库的情况下执行此操作

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

规格非常具体,我觉得我可能遗漏了一些东西

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

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

我想我已经明白了

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

在执行之前,不得调用
onCompleted
onRejected
上下文堆栈只包含平台代码

这里的“平台代码”是指引擎、环境和承诺 实现代码。在实践中,这一要求确保 事件发生后,
onCompleted
onRejected
异步执行 循环回合,在循环回合中调用
,然后调用
,并使用新堆栈。这可能是
使用“宏任务”机制(如
setTimeout
setImmediate
,或使用“微任务”机制,如
MutationObserver
process.nextTick
。自承诺实施以来 被认为是平台代码,它本身可能包含一个任务调度 调用处理程序的队列或“蹦床”

此外,除了异步执行它们(即使承诺已被解析)并仍然立即返回结果的承诺所产生的主要复杂性之外,您当前的代码没有遵循承诺解析的详细信息,只会立即返回带有
then
方法的所有对象,即使它们不是一致的承诺

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


使用现有库:-)

为什么要这样做?这只是为了学习吗?(同样不,你的实现不是一个+抱怨)@BenjaminGruenbaum我正在努力在我正在开发的库中添加一些与A+/承诺的基本互操作性,我不想像Q或什么时候那样拉一个大承诺库,以便我可以在解决的承诺中封装一些值。所以使用一个轻量级承诺库,有些只有1-2KB。感谢您的反馈-异步点很棘手,但我仍然认为不需要太多额外的代码就可以实现。我正试图在我正在处理的库中添加一些与+/承诺的基本互操作性,我不想引入像Q或When这样的大承诺库,以便在已解决的承诺中封装一些值。@RemyD'Agostino接受与之互操作的库中的承诺构造函数并调用它。如果您不想在代码中包含promise库,那么在DIUh中获得功能,异步执行回调并仍然返回正确的结果promise将需要更多的代码。你可能想检查一些较小的想法。对于基本的互操作性,您不需要返回一个完整的承诺,而只需要像您已经做的那样返回一个thenable。然后让您的用户将其包装在所选库的实际承诺中。