コード自体が実行されます。何とか行方不明になっているという明らかな修正がありますか?「拒否」がこのコードで実際に拒否されないのはなぜですか?
Webstormのデバッガでは、デバッグ中にreject
文が強調表示されますが、実際にコードが拒否されることはありません。デバッガは、その後fulfill
文を強調し、最終的にはthen
ブロックに戻り、しかし、then
ブロックは、次のステップですぐにスキップされ、catch
ブロックは、その後
を実行し、私は「then-catch
コード巻き付け別の約束を、持っていますまた戻ってくる。私の計画はヘルパー関数からの拒否をキャッチすることでした。そして、私の主な機能がそれをキャッチした後、戻り値(約束)として再び拒否しました
ヘルパー関数から戻った後にデバッガがcatch
ステートメントをハイライト表示している間、
public static filter(courses: Course[], filterObj: FILTER, comparison: string) {
return new Promise(function (fulfill, reject) {
let filter: any = (<any>filterObj)[comparison];
let names = Object.keys(filter);
if (names.length !== 1)
{
console.log("??");
reject({"code": 400, "body": {"error": "invalid comparison"}});
}
let name = names.toString();
if (!CHelpers.isDataset(name))
{
reject({"code": 400, "body": {"error": "invalid comparison"}});
}
let filterValue: number = filter[name];
if (typeof filterValue !== "number")
{
reject({"code": 400, "body": {"error": "invalid comparison"}});
}
let key: string = CHelpers.getKey(name);
console.log("successfully filtered " + comparison);
fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison));
})
}
私の当時のキャッチコード:(私のヘルパー関数は、その全体が終了し、メイン関数に戻って取得した後に)
は、コードを果たすリジェクト私のブロック内のすべてのコードがスキップされていること:
CHelpers.filter(courses, filterObj, comparison)
.then(function(filteredCourses: any) {
courses = filteredCourses;
})
.catch(function(err: any) {
return reject(err);
});
私の主な機能は、一種の次のようになります。
doThing(input: any): Promise < {} >
{
return new Promise(function(fulfill, reject) {
let courses: Course[];
let filterObj: FILTER = input.KEY;
let comparisons: string[] = Object.keys(filterObj);
let comparison: string = comparisons[0];
if (comparison === "test") {
CHelpers.filter(courses, filterObj, comparison)
.then(function(filteredCourses: any) {
courses = filteredCourses;
})
.catch(function(err: any) {
return reject(err);
});
} else {
reject({
"code": 400,
"body": {
"error": "invalid body"
}
});
}
let responseBody: {} = {
render: "TABLE",
result: courses
};
fulfill({
"code": 200,
"body": responseBody
});
});
}
感謝jfriend00、ヘルパー関数が適切に拒否している、しかし、私のcatchブロック内のコードは、(デバッガが唯一のcatch文を強調しますが、内のコードをスキップ)実行されません。それは「後の拒絶が無視される」と関係しなければならないのでしょうか? – icda
@icda - '.catch()'内部の 'reject(err);'が間違っています。拒否を継続するつもりならば、 'throw err'を実行するか、' Promise.reject(err) 'を返します。 '.catch()'の内部に 'reject()'は定義されていません。あなたが言うときは、 '。catch() 'は' .catch() 'の中で何も動かない、あるいは' .catch() 'のコードのうちのいくつかだけが動いていると言っていますか? – jfriend00
@icda - 質問を再読しました。あなたが 'reject'に入って、デバッガで' .catch() 'ブロックを実行するのを見た場合、それは起こりません。実際の '.catch()'は、JSの現在のスレッドが実行を終了した後に非同期に実行されます。あなたは '.catch()'ブロックにブレークポイントを設定することができ、ヒットする必要があります。 – jfriend00