Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.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处理被遗忘的承诺_Javascript_Ecmascript 6_Promise - Fatal编程技术网

用JavaScript处理被遗忘的承诺

用JavaScript处理被遗忘的承诺,javascript,ecmascript-6,promise,Javascript,Ecmascript 6,Promise,下面是一个例子,希望能让理解这个问题变得更容易 var listen=document.querySelector(“#listen”), cancel=document.querySelector(#cancel”), 提交=文档。查询选择器(“提交”); var promiseResolve=null; 听。添加ventListener(“单击”,惊奇地听); cancel.addEventListener(“单击”,中止); submit.addEventListener(“单击”,即S

下面是一个例子,希望能让理解这个问题变得更容易

var listen=document.querySelector(“#listen”),
cancel=document.querySelector(#cancel”),
提交=文档。查询选择器(“提交”);
var promiseResolve=null;
听。添加ventListener(“单击”,惊奇地听);
cancel.addEventListener(“单击”,中止);
submit.addEventListener(“单击”,即SubmitClick);
submit.disabled=true;
函数startListening(){
submit.disabled=false;
listen.disabled=true;
新承诺(功能(解决){
promiseResolve=解决;
}).然后(提交);
}
函数中止(){
listen.disabled=false;
submit.disabled=true;
promiseResolve=null;
}
函数onSubmitClick(){
if(promiseResolve)promiseResolve();
}
函数onSubmit(){
控制台日志(“完成”);
中止();
}
听
提交
取消回答中提到的

大多数使用承诺的代码都希望它们在某些时候得到解决或拒绝 指向未来(这就是为什么承诺首先被使用的原因)。 如果他们不这样做,那么代码通常永远无法完成它的工作

您可能有其他一些代码来完成这个任务 为这项任务而努力,而承诺却从未放弃过 做自己的事。如果您这样做,Javascript中就没有内部问题 这是一种方式,但这并不是承诺的目的和意义 通常情况下,承诺的消费者并不希望承诺发挥作用

未能解决或拒绝承诺不会导致Javascript出现问题,但无论如何,这是一种不好的做法。如果承诺从未解决,则应用程序无法确定承诺发生了什么。不要让承诺处于不确定状态,而是返回一个类似于错误消息的值,并将承诺筛选结果用于错误消息。如果发现错误,请拒绝()承诺,以便应用程序可以决定其下一步行动

var listen=document.querySelector(“#listen”),
cancel=document.querySelector(#cancel”),
提交=文档。查询选择器(“提交”);
var promiseResolve=null;
听。添加ventListener(“单击”,惊奇地听);
cancel.addEventListener(“单击”,一旦取消单击);
submit.addEventListener(“单击”,即SubmitClick);
submit.disabled=true;
函数startListening(){
submit.disabled=false;
listen.disabled=true;
新承诺(功能(解决、拒绝){
PromiseSolve=(错误)=>{
if(error){reject(error);}else{resolve();}
};
}).然后(提交)
.catch(error=>onError(error));
}
函数中止(){
listen.disabled=false;
submit.disabled=true;
promiseResolve=null;
}
函数onSubmitClick(){
if(promiseResolve)promiseResolve();
}
函数onCancelClick(){
如果(promiseResolve)promiseResolve(“取消”);
}
函数onSubmit(){
控制台日志(“完成”);
中止();
}
函数onError(错误){
控制台。警告(错误);
中止();
}
听
提交
取消回答中提到的

大多数使用承诺的代码都希望它们在某些时候得到解决或拒绝 指向未来(这就是为什么承诺首先被使用的原因)。 如果他们不这样做,那么代码通常永远无法完成它的工作

您可能有其他一些代码来完成这个任务 为这项任务而努力,而承诺却从未放弃过 做自己的事。如果您这样做,Javascript中就没有内部问题 这是一种方式,但这并不是承诺的目的和意义 通常情况下,承诺的消费者并不希望承诺发挥作用

未能解决或拒绝承诺不会导致Javascript出现问题,但无论如何,这是一种不好的做法。如果承诺从未解决,则应用程序无法确定承诺发生了什么。不要让承诺处于不确定状态,而是返回一个类似于错误消息的值,并将承诺筛选结果用于错误消息。如果发现错误,请拒绝()承诺,以便应用程序可以决定其下一步行动

var listen=document.querySelector(“#listen”),
cancel=document.querySelector(#cancel”),
提交=文档。查询选择器(“提交”);
var promiseResolve=null;
听。添加ventListener(“单击”,惊奇地听);
cancel.addEventListener(“单击”,一旦取消单击);
submit.addEventListener(“单击”,即SubmitClick);
submit.disabled=true;
函数startListening(){
submit.disabled=false;
listen.disabled=true;
新承诺(功能(解决、拒绝){
PromiseSolve=(错误)=>{
if(error){reject(error);}else{resolve();}
};
}).然后(提交)
.catch(error=>onError(error));
}
函数中止(){
listen.disabled=false;
submit.disabled=true;
promiseResolve=null;
}
函数onSubmitClick(){
if(promiseResolve)promiseResolve();
}
函数onCancelClick(){
如果(promiseResolve)promiseResolve(“取消”);
}
函数onSubmit(){
控制台日志(“完成”);
中止();
}
函数onError(错误){
控制台。警告(错误);
中止();
}
听
提交

取消
我相信理论上它应该得到GC'ed。但它使用的是承诺,而不是设计它们的目的。为了真正获得承诺的好处,最好考虑一下如何以同步的方式实现这一点,然后以这种方式编写代码。你可以让你的惊喜变成一个承诺,然后把它放在一个循环中,对于abort,我会生成一个自定义错误,比如
EAbort
。经常有很多关于可撤销承诺的讨论,但我不确定这是什么状态。我相信谷歌不喜欢这个想法,可能是因为一个可取消的承诺有点像一个任务终止GC通过查看引用来工作,如果引用无法返回到根/全局,则ps.计时器等也是全局的,。然后垃圾收集器将进行处理。GC甚至聪明到可以使用GC