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