Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/450.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_Asynchronous_Promise_Chain - Fatal编程技术网

Javascript 承诺:不考虑解决/拒绝而执行某事?

Javascript 承诺:不考虑解决/拒绝而执行某事?,javascript,asynchronous,promise,chain,Javascript,Asynchronous,Promise,Chain,使用Promises设计模式,是否可以实现以下功能: var a, promise if promise.resolve a = promise.responsevalue; if promise.reject a = "failed" AFTER resolution/rejection. Not ASYNC!! send a somewhere, but not asynchronously. //Not a promise 我要找的是类似于在t

使用Promises设计模式,是否可以实现以下功能:

 var a, promise

 if promise.resolve
     a = promise.responsevalue;

 if promise.reject
     a = "failed"

 AFTER resolution/rejection. Not ASYNC!!
     send a somewhere, but not asynchronously. //Not a promise
我要找的是类似于在
try-catch
情况下的
finally


PS:我在NodeJS上使用ES6 Promise polyfill

注意:
最后
现在是JavaScript承诺的标准部分,因此您可以这样做:

thePromise.then(result => doSomething(result)
          .catch(error => handleOrReportError(error))
          .finally(() => doSomethingAfterFulfillmentOrRejection());
之前的答案最后是标准答案:


如果您从
catch
返回一个值,那么您可以对
catch
的结果使用
then

thePromise.then(result => doSomething(result)
          .catch(error => handleErrorAndReturnSomething(error))
          .then(resultOrReturnFromCatch => /* ... */);
…但这意味着您正在将拒绝转化为实现(通过从
catch
返回某些内容,而不是抛出或返回被拒绝的承诺),并且依赖于这一事实


如果您希望某些内容能够在履行/拒绝过程中透明地传递,而不进行修改,那么ES2015(“ES6”)中没有任何内置的承诺可以做到这一点(编辑:,现在又有了),但编写起来很容易(这是在ES2015中,但我有下面的ES5翻译):

例如:

{
让worker=(p,f,done)=>{
返回p.constructor.resolve(f())。然后返回(done,done);
};
Object.defineProperty(Promise.prototype,“finally”{
价值(f){
把这个还给我,好吗(
结果=>worker(这个,f,()=>result),
error=>worker(this,f,()=>{throw error;})
);
}
});
}
测试(“p1”,承诺。解决(“好”)。最后(
() => {
测试(“p2”,承诺。拒绝(“坏”);
}
);
功能测试(名称,p){
返回p(
结果=>{
日志(名称,“初始履行:”,结果);
返回结果;
},
错误=>{
log(名称,“初始拒绝;传播它”);
投掷误差;
}
)
.最后(()=>{
log(名称“in finally”);
})
.那么(
结果=>{
日志(名称,“完成:”,结果);
},
错误=>{
日志(名称,“已拒绝:”,错误);
}
);
}
ES2015代码:

promise.then(val => val).catch(() => "failed").then(a => doSomethigWithA(a));

这是纯ES6吗?请看这里:我正在nodejsp上使用ES6 Promise polyfill可能重复的
Promise.then(函数success(responseValue){return responseValue;},函数error(){return“failed”;})您不能检查这样的承诺的状态或结果。一旦您收到一个promise对象,您只能调用它的
then
catch
方法,并提供适当的回调,以便在稍后您的promise解析或拒绝时调用。
promise。然后(val=>val)
没有用。@Ryan这只是这个问题的一个例子,它不会异步执行
doSomethignWithA(a)
?如中所述,如果最初的承诺解决方案延迟了5秒,那么,
doSomethingWithA(a)
是否继续执行?@ChanandlerBong如果我理解正确,那么是的,
doSomethingWithA
将仅在最初的
promise
之后运行。我尝试了它并添加了5秒的延迟。不管怎样,它继续执行
doSomethingWithA
。所以这是异步的。我在找一个同步器solution@tj这不会异步执行
resultOrReturnFromCatch
?如中所述,如果最初的承诺解决方案延迟了5秒,那么,
resultOrReturnFromCatch
不会继续执行吗?@ChanandlerBong:不会,为什么会?顺便说一句,我在末尾添加了一个实用函数版本,因此您不必扩展子类的原型。@ChanandlerBong:我突然想到,您说您正在使用Promise polyfill,并且“非常愿意”使用ES6,这表明您现在没有使用它。因此,所有这些带有箭头函数的答案(在我的例子中还有扩展运算符)都是…有限实用的。:-)我在上面添加了原型扩展的ES5版本。我认为这是ES5中最合理的方法。
始终
实用程序函数基本上不可能在ES5中合理编写,因为需要向
然后
提供两个参数(因此是扩展运算符)。
promise.then(val => val).catch(() => "failed").then(a => doSomethigWithA(a));