如果执行者没有解决ES6 JavaScript承诺,那么它是否可以通过其他方式解决?

如果执行者没有解决ES6 JavaScript承诺,那么它是否可以通过其他方式解决?,javascript,promise,es6-promise,Javascript,Promise,Es6 Promise,如果以这种方式创建承诺: myPromise = new Promise(function(resolve, reject) {}); 这个承诺能以任何方式解决吗?显然,在这种情况下,遗嘱执行人并没有解决它,那么承诺是否可以解决呢 我认为如果它是jQuery,可以通过deferred.resolve()来解析,从而解析相关的承诺deferred.promise()。将解析函数分配给承诺范围之外的变量否,承诺只能分别通过resolve和reject功能来解决或拒绝 如果这些函数既不被调用也不被公

如果以这种方式创建承诺:

myPromise = new Promise(function(resolve, reject) {});
这个承诺能以任何方式解决吗?显然,在这种情况下,遗嘱执行人并没有解决它,那么承诺是否可以解决呢


我认为如果它是jQuery,可以通过
deferred.resolve()
来解析,从而解析相关的承诺
deferred.promise()

将解析函数分配给承诺范围之外的变量否,承诺只能分别通过
resolve
reject
功能来解决或拒绝

如果这些函数既不被调用也不被公开,承诺将永远处于挂起状态

这也是一个安全级别,因为它可以帮助您确保您等待的承诺将在您期望的时间和您期望的价值得到解决;并允许您安全地返回内部承诺,因为它是(没有任何危险或泄露秘密)

要做出承诺,这依赖于另一个您无法控制但可以手动解决(或拒绝)的承诺,无论原始承诺是什么,您可以使用
promise.race()
函数:

//可能永远挂起的最初承诺
const original=新承诺(()=>{})
//控制器承诺,其解析器已公开(或包含“手动”解析所需的逻辑)
让我们解决
常量控制器=新承诺(rs=>{resolve=rs})
//您等待的承诺(可由'original'或'controller'解决或拒绝)
const mixed=Promise.race([原始,控制器])
混合。然后(console.log)

setTimeout(()=>resolve('Resolved'),2000)
否,承诺只能分别由
resolve
reject
函数解析或拒绝

如果这些函数既不被调用也不被公开,承诺将永远处于挂起状态

这也是一个安全级别,因为它可以帮助您确保您等待的承诺将在您期望的时间和您期望的价值得到解决;并允许您安全地返回内部承诺,因为它是(没有任何危险或泄露秘密)

要做出承诺,这依赖于另一个您无法控制但可以手动解决(或拒绝)的承诺,无论原始承诺是什么,您可以使用
promise.race()
函数:

//可能永远挂起的最初承诺
const original=新承诺(()=>{})
//控制器承诺,其解析器已公开(或包含“手动”解析所需的逻辑)
让我们解决
常量控制器=新承诺(rs=>{resolve=rs})
//您等待的承诺(可由'original'或'controller'解决或拒绝)
const mixed=Promise.race([原始,控制器])
混合。然后(console.log)

setTimeout(()=>resolve('Resolved'),2000)
上述解决方案很好,但我认为我们可以创建单独的函数/类/任何东西,使其更加封闭

function CreatePromise (executor) {
    let resolve;
    let reject;

    const promise = new Promise((res, rej) => {
        resolve = res;
        reject = rej;
        executor(res, rej)
    })

    return {
        resolve,
        reject,
        promise
    }
}

const { reject, promise } = CreatePromise((resolve) => {
    setTimeout(() => {
        resolve()
    }, 100000)
})

上面的解决方案很好,但我认为我们可以创建单独的函数/类/任何东西,使其更加封闭

function CreatePromise (executor) {
    let resolve;
    let reject;

    const promise = new Promise((res, rej) => {
        resolve = res;
        reject = rej;
        executor(res, rej)
    })

    return {
        resolve,
        reject,
        promise
    }
}

const { reject, promise } = CreatePromise((resolve) => {
    setTimeout(() => {
        resolve()
    }, 100000)
})

如果你在window.Promise上打了补丁,是的,但你肯定不是这么想的about@CertainPerformance你是说你实际上改变了承诺的机制?例如,创建承诺时,将
resolve
分配给
promise.resolve
,以便承诺可以通过
promise.resolve()
?自行解决,或者如果确实想把事情搞砸,只需在构造函数中调用
.resolve()
。你并没有真正改变承诺的运作机制,你正在破坏
窗口。承诺
做一些不符合规范的事情也请注意-ES6承诺不使用延迟模式。如果你修改了
窗口。承诺
,是的,但你肯定不是这么想的about@CertainPerformance你是说你实际上改变了承诺的机制?例如,创建承诺时,将
resolve
分配给
promise.resolve
,以便承诺可以通过
promise.resolve()
?自行解决,或者如果确实想把事情搞砸,只需在构造函数中调用
.resolve()
。你并没有真正改变承诺的工作机制,你正在破坏
窗口。承诺
做一些不符合规范的事情。同样,ES6承诺不使用延迟模式。不过,这个承诺构造函数并没有这样做。如果一个承诺是这样创建的:但是它们并不能阻止你在你的承诺函数中手动执行它,但是这个承诺构造函数并没有这样做。如果一个承诺是这样创建的:但是他们并不能阻止你在你的承诺函数中手动执行它,你所说的“hermetic”是什么意思,为什么这是可取的?当我说hermetic时,我的意思是我们不需要创建
让我们解决和<代码>让我们拒绝每次我们要在哪里进行此拒绝。相反,我创建了
CreatePromise
,它避免了代码重复并隐藏了不必要的元素,所以将使用该函数的人不需要知道我们是如何获得返回值的。你所说的“hermetic”是什么意思,为什么这是可取的?当我说hermetic时,我的意思是我们不需要创建
let resolve和<代码>让我们拒绝每次我们要在哪里进行此拒绝。相反,我创建了
CreatePromise
,它避免了代码重复并隐藏了不必要的元素,所以将使用该函数的人不需要知道我们是如何获得返回值的。