这是一个非常深奥的问题。
编写接受单个值并返回符合条件的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);
})();
答案 0 :(得分:1)
编写函数的简单方法是什么,它接受单个值并返回一个符合规定的Promises / A +,它会立即用提供的值解析。我想在不使用现有库的情况下执行此操作。
没有。基本上,在不使用现有库的情况下创建符合Promises / A +的承诺意味着您必须编写自己的兼容库;这是一项非常重要的任务。
规范非常具体,我觉得我可能错过了一些东西。
Promises / A +规范只是关于Promise的.then
方法应该如何工作,以及库应该如何处理具有then
方法但不是自己的Promise类型实例的对象。
规范没有说明如何或通过什么方法创建Promise对象,也没有说明如何解决它。
我想我已经明白了
不,您的then
方法违反了规范中的几点;最具体的是#2.2.4:
在执行之前,不得调用
onFulfilled
或onRejected
上下文堆栈仅包含平台代码。此处“平台代码”表示引擎,环境和承诺 实施代码。在实践中,这个要求确保了这一点 在事件发生后,
onFulfilled
和onRejected
异步执行 循环转入,其中调用then
,并使用新堆栈。这可以 使用“{1}}或”setTimeout
等“宏任务”机制实现setImmediate
,或者使用“微任务”机制MutationObserver
或process.nextTick
。自承诺实施以来 被认为是平台代码,它本身可能包含任务调度 队列或“trampoline”,其中称为处理程序
此外,除了执行它们异步所产生的主要合规(即使承诺已经解决)并且仍然立即返回结果的承诺,您当前的代码不遵循承诺解决方案详细信息,只需立即使用then
方法返回所有对象,即使它们不符合要求。
我也很想知道是否有更好的方法。
使用现有的库: - )