我编写的代码看起来像:
function getStuffDone(param) { | function getStuffDone(param) {
var d = Q.defer(); /* or $q.defer */ | return new Promise(function(resolve, reject) {
// or = new $.Deferred() etc. | // using a promise constructor
myPromiseFn(param+1) | myPromiseFn(param+1)
.then(function(val) { /* or .done */ | .then(function(val) {
d.resolve(val); | resolve(val);
}).catch(function(err) { /* .fail */ | }).catch(function(err) {
d.reject(err); | reject(err);
}); | });
return d.promise; /* or promise() */ | });
} | }
Run Code Online (Sandbox Code Playgroud)
有人告诉我这个被称为" 延迟反模式 "或" Promise构造函数反模式 ",这个代码有什么不好,为什么这被称为 …
javascript使用不可变或可变的字符串吗?我需要一个"字符串构建器"吗?
这可能是一个愚蠢的问题,但是中间的承诺链,你如何拒绝来自其中一个函数的承诺呢?例如:
someActionThatReturnsAPromise()
.then(function(resource) {
return modifyResource(resource)
})
.then(function(modifiedResource) {
if (!isValid(modifiedResource)) {
var validationError = getValidationError(modifiedResource);
// fail promise with validationError
}
})
.catch(function() {
// oh noes
});
Run Code Online (Sandbox Code Playgroud)
不再引用原始的解析/拒绝功能或PromiseResolver.我应该添加return Promise.reject(validationError);吗?
我在教程中找到了以下代码:
promise.then(function(result){
//some code
}).catch(function(error) {
throw(error);
});
Run Code Online (Sandbox Code Playgroud)
我有点困惑:抓住电话会做什么吗?在我看来,它没有任何影响,因为它只是抛出了被捕获的相同错误.我的基础是常规try/catch的工作原理.
在以下代码中:
var p1 = new Promise(function (resolve, reject) {
throw 'test1';
});
var p2 = new Promise(function (resolve, reject) {
reject('test2');
});
p1.catch(function (err) {
console.log(err); // test1
});
p2.catch(function (err) {
console.log(err); // test2
});
Run Code Online (Sandbox Code Playgroud)
从api 使用reject(in p2)Promise和使用错误(in p1)之间有什么区别throw吗?
它完全一样吗?
如果它相同,为什么我们需要reject回调呢?
在处理REST API调用的此函数中,处理部分请求的任何被调用函数都可能抛出错误,表示应将错误代码作为响应发送.但是,函数本身也可能发现错误,此时它应该跳转到异常处理块.
static async handleRequest(req) {
try {
let isAllowed = await checkIfIsAllowed(req);
if (!isAllowed) {
throw new ForbiddenException("You're not allowed to do that.");
}
let result = await doSomething(req); // can also raise exceptions
sendResult(result);
} catch(err) {
sendErrorCode(err);
}
}
Run Code Online (Sandbox Code Playgroud)
Webstorm将throw使用以下消息强调:'throw' of exception caught locally. This inspection reports any instances of JavaScript throw statements whose exceptions are always caught by containing try statements. Using throw statements as a "goto" to change the local flow of …
我正在将我的承诺链接代码重构为异步/等待风格。这样做的原因之一是我想要一个 catch 块来处理所有错误情况(如此处所述Understanding Promise Rejection in Node.js)
我的问题是,当我遇到同步错误时,我应该致电await Promise.reject还是throw error退出该过程?我知道这两种方式都可以,但我更喜欢throw error。我已经知道我得到的结果无效,为什么还要等待?使用 throw 立即终止控制流似乎是更好的选择。
我不是在谈论承诺链(我的问题的全部要点),所以我不认为线程JavaScript Promises -reject vs. throw回答了我的问题。
我读过《Node.js 中的错误处理》一文,我认为它也没有给出答案。但它确实说了
给定的函数应该同步(使用 throw)或异步(使用回调或事件发射器)传递操作错误,但不能同时传递。...一般来说,使用 throw 并期望调用者使用 try/catch 的情况非常罕见...
我的异步函数可能会返回 Promise.reject。因此,我关心的是介绍两种传递错误的方法,正如该文章所反对的那样。
try {
let result = await aysncFunc().
if (!isResultValid(result)) { //isResultValid() is sync function
await Promise.reject('invalid result')
//or throw 'invalid result'
}
... //further processing
}
catch (error) {
...
}
Run Code Online (Sandbox Code Playgroud) 我一直试图理解为什么下面的代码没有抓住它throw.如果async从new Promise(async (resolve, ...部件中删除关键字,那么它可以正常工作,因此它与Promise执行程序是异步函数的事实有关.
(async function() {
try {
await fn();
} catch(e) {
console.log("CAUGHT fn error -->",e)
}
})();
function fn() {
return new Promise(async (resolve, reject) => {
// ...
throw new Error("<<fn error>>");
// ...
});
}
Run Code Online (Sandbox Code Playgroud)
这里的答案,这里和这里重复一遍"如果你在任何其他异步回调中,你必须使用reject",但是"异步"它们并不是指async函数,所以我认为它们的解释不适用于此(如果他们这样做,我不明白如何).
如果不是throw我们使用reject,上面的代码工作正常.从根本上说,我想明白为什么throw不在这里工作.谢谢!
我只是想问catch如果解析上的值不是预期的,我应该如何传递解析承诺。
例如
let prom = getPromise();
prom.then(value => {
if (value.notIWant) {
// Send to catch <-- my question is here, I want to pass it on the catch.
}
// Process data.
}).catch(err => {
// Pass the error through ipc using json, for logging.
});
Run Code Online (Sandbox Code Playgroud)
我尝试使用throw,但对象无法解析为 json,只是得到一个空对象。
回答:
@BohdanKhodakivskyi 下面的第一条评论是我想要的答案。
@31py 答案也是正确的,但 @BohdanKhodakivskyi 解决方案要简单得多,并且会呈现相同的结果。
javascript ×9
promise ×7
async-await ×3
node.js ×3
bluebird ×1
es6-promise ×1
ipc ×1
json ×1
q ×1
rest ×1
string ×1