如果以这种方式创建承诺:
myPromise = new Promise(function(resolve,reject) {});
这个诺言可以通过任何方式解决吗?显然,在这种情况下,执行者无法解决问题,那么诺言能否得到解决?
我认为如果它是jQuery,则可以用deferred.resolve()
来解决,以便解决相关的承诺deferred.promise()
。
如果以这种方式创建承诺:
myPromise = new Promise(function(resolve,reject) {});
这个诺言可以通过任何方式解决吗?显然,在这种情况下,执行者无法解决问题,那么诺言能否得到解决?
我认为如果它是jQuery,则可以用deferred.resolve()
来解决,以便解决相关的承诺deferred.promise()
。
否,分别只能通过resolve
和reject
函数来解决诺言。
如果不调用或不公开这些功能,则承诺将永远保持待处理状态。
这也是一个安全级别,因为它可以帮助您确保等待的承诺将分解为您期望的值和期望的值;并允许您安全地返回内部承诺(没有任何危险或泄露秘密)。
要做出承诺,它依赖于您没有控制权的另一个承诺,但是可以手动解决(或拒绝)它,而无论原始的是什么,都可以使用Promise.race()
函数:
//The original promise that may pend forever
const original = new Promise(()=>{})
//Controller promise,whose resolver is exposed (or contains the logic needed for "manual" resolution)
let resolve
const controller = new Promise(rs=>{resolve=rs})
//The promise you wait for (and can be resolved or rejected either by `original` or `controller`)
const mixed = Promise.race([original,controller])
mixed.then(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)
})