如何在Promise外部控制其状态
请问如何避免报错呢?
我应该思路就是错的, 求解决思路
var obj = {
ok: null,
cancel: null
};
function fn() {
return new Promise((resolve, reject) => {
obj.ok = resolve;
obj.cancel = reject;
});
}
fn();
obj.cancel(); // Uncaught (in promise) undefined
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
先直接说代码的问题,在于 Promise 没有
catch
,可以或者直接在
then
的时候指定第二个回调然后来说说这个设计思路的问题
Promise 是一次性的,也就是说,如果你调用了
resolve
或者reject
这个 Promise 会处理相关回调,然后它的生命周期就结束了。那么在这种情况下,你把resolve
和reject
赋给obj
作为属性使用,就不符合“一次性”,因为可以通过obj
多次调用。所以这个设计思路本身是有问题的然后,从你的代码我看不出来你是想干啥。Promise 用于处理异步调用,那一定是存在异步调用才需要处理,所以要从异步调用的点开始去思考。
比如,有一个
click
事件,它是一个异步调用(用户什么时候点击并不知道)。一般操作是为这个单击事件写回调,单击时触发。如果你想用 Promise,就需要在 Promise 里设置单击事件,并在这个事件触发之后,调用 Promise 的resolve
或reject
,同时,由于 Promise 是一次性的,所以还得注销这个事件,过程是这样当然这里单击事件只是为了表示异步,实际上事件处理直接用回调更方便。所以用 Promise,一定要找到你异步的起点在哪里,不然 Promise 没啥意义。
最后,如果有空可以了解下 async/await,Node 7.6 之后就完全支持了,用它以同步形式的代码写异步会方便得多。
然后
输出
但是并不推荐这样用,因为一个
Promise
`resolve或者
reject之后其状态就不会再发生改变了,所以这时
obj所保留的两个对
resolve和
reject`的引用就完全没有存在的意义了var obj = {
};
let fn=new Promise((resolve, reject)=>{
fn.then(function(v){ console.log(v)});
vue里可以这样用
首先我赞成 @边城 的说法,Promise不是楼主这么用的;
其次,就技术研讨来说,楼主想要达成的,通过obj来从外部控制promise状态的事其实是可以办到的:
1、Promise的状态取决于promise主体中是否调用了resolved或者reject或者在调用resolved和reject前就发生异常(将会直接进入reject状态)
2、Promise也是js对象(虽然它实际是个函数)、逃不开按地址引用带来的副作用,所以楼主想要达到的想法是可以实现的,楼主写的代码是想调用reject,但是没有设置fn的reject,或者catch,所以会报错。Promise允许你不设置resolved方法(即如果楼主直接调用obj.ok()是没问题的,不会报错,promise状态也会变为resolved)、但如果出现异常或者主动调用进入reject而没有设置reject方法或catch方法,则会报错。