Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/6.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 是否有办法判断ES6承诺是否得到履行/拒绝/解决?_Javascript_Promise_Ecmascript 6 - Fatal编程技术网

Javascript 是否有办法判断ES6承诺是否得到履行/拒绝/解决?

Javascript 是否有办法判断ES6承诺是否得到履行/拒绝/解决?,javascript,promise,ecmascript-6,Javascript,Promise,Ecmascript 6,我习惯于Dojo承诺,在这里我可以做到以下几点: promise.isFulfilled(); promise.isResolved(); promise.isRejected(); 是否有办法确定ES6承诺是否得到履行、解决或拒绝?如果没有,是否有一种方法可以使用Object.defineProperty(Promise.prototype,…)填充该功能?它们不是规范的一部分,也没有一种标准的访问它们的方法,您可以使用它来获取Promise的内部状态,以构建polyfill。但是,您可以通

我习惯于Dojo承诺,在这里我可以做到以下几点:

promise.isFulfilled();
promise.isResolved();
promise.isRejected();

是否有办法确定ES6承诺是否得到履行、解决或拒绝?如果没有,是否有一种方法可以使用
Object.defineProperty(Promise.prototype,…)
填充该功能?

它们不是规范的一部分,也没有一种标准的访问它们的方法,您可以使用它来获取Promise的内部状态,以构建polyfill。但是,您可以通过创建包装器将任何标准承诺转换为具有这些值的承诺

function MakeQueryablePromise(promise) {
    // Don't create a wrapper for promises that can already be queried.
    if (promise.isResolved) return promise;
    
    var isResolved = false;
    var isRejected = false;

    // Observe the promise, saving the fulfillment in a closure scope.
    var result = promise.then(
       function(v) { isResolved = true; return v; }, 
       function(e) { isRejected = true; throw e; });
    result.isFulfilled = function() { return isResolved || isRejected; };
    result.isResolved = function() { return isResolved; }
    result.isRejected = function() { return isRejected; }
    return result;
}

这不会像修改原型那样影响所有承诺,但它确实允许您将承诺转换为公开其状态的承诺。

如果我没有弄错,您应该能够访问状态并解析内部插槽的意图,格式为
[[]]
是否无法访问它们,因为它们是可能在实现中实际不存在的规范详细信息。它们用于描述规范的行为,而不是实际对象的运行时布局;所以,不,你不能访问内部状态。为什么这个问题被标记为重复的?这是一个实际回答较好的问题。另一个只是告诉你你不能做什么,并且没有提供任何关于解决方案的提示。我认为另一个问题/答案对于实际解决提出的问题是无用的。这似乎是错误的。当承诺被拒绝时,您的实现为isResolved返回false。我会在fully回调中设置iscompleted,然后根据设置的iscompleted或isRejected计算isResolved。然而,最简单的方法是将isResolved与isCompleted和isRejected的值一起设置在两个回调中。您应该使用
IsSetted
IsCompleted
isRejected
。问题是关于用标准承诺模拟Dojo,术语是他们的,而不是我的。这在所有3个函数中对我总是返回false…请注意,这不会同步工作,即使对于已经解决的承诺也是如此。例如,
console.log(makequeryablepromise(Promise.resolve(777)).isResolved())
给出
false