2017-01-31 4 views
0

コード自体が実行されます。何とか行方不明になっているという明らかな修正がありますか?「拒否」がこのコードで実際に拒否されないのはなぜですか?

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 
      }); 
     }); 
    } 

答えて

2

reject()は、そのブロック内のコードの実行を停止しません。これは単なる関数呼び出しなので、その関数呼び出しの後で残りの.then()ハンドラが引き続き実行されます。約束は一方向の状態マシンなので、reject()またはfulfill()へのその後の呼び出しは、reject()を呼び出すと無視されますが、他のconsole.log()ステートメントが実行されます。

通常、返却するとすぐに関数から戻り、コードを実行しなくなります。

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("??"); 
       return reject({"code": 400, "body": {"error": "invalid comparison"}}); 
      } 
      let name = names.toString(); 

      if (!CHelpers.isDataset(name)) 
      { 
       return reject({"code": 400, "body": {"error": "invalid comparison"}}); 
      } 

      let filterValue: number = filter[name]; 
      if (typeof filterValue !== "number") 
      { 
       return 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)); 

     }) 
    } 

reject()の呼び出しと同じ行に3つのreturnのキーワードの追加。

としてあなたはどちらかのコードを、それができ

return reject(...); 

かのように:

reject(...); 
return; 

reject()は、戻り値はありませんので、これらの2つの形式は機能的に同等です。

+0

感謝jfriend00、ヘルパー関数が適切に拒否している、しかし、私のcatchブロック内のコードは、(デバッガが唯一のcatch文を強調しますが、内のコードをスキップ)実行されません。それは「後の拒絶が無視される」と関係しなければならないのでしょうか? – icda

+1

@icda - '.catch()'内部の 'reject(err);'が間違っています。拒否を継続するつもりならば、 'throw err'を実行するか、' Promise.reject(err) 'を返します。 '.catch()'の内部に 'reject()'は定義されていません。あなたが言うときは、 '。catch() 'は' .catch() 'の中で何も動かない、あるいは' .catch() 'のコードのうちのいくつかだけが動いていると言っていますか? – jfriend00

+1

@icda - 質問を再読しました。あなたが 'reject'に入って、デバッガで' .catch() 'ブロックを実行するのを見た場合、それは起こりません。実際の '.catch()'は、JSの現在のスレッドが実行を終了した後に非同期に実行されます。あなたは '.catch()'ブロックにブレークポイントを設定することができ、ヒットする必要があります。 – jfriend00

1

fulfill関数とreject関数のreturn文を追加するようにしてください。

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("??"); 
      return reject({"code": 400, "body": {"error": "invalid comparison"}}); 
     } 
     let name = names.toString(); 

     if (!CHelpers.isDataset(name)) 
     { 
      return reject({"code": 400, "body": {"error": "invalid comparison"}}); 
     } 

     let filterValue: number = filter[name]; 
     if (typeof filterValue !== "number") 
     { 
      return reject({"code": 400, "body": {"error": "invalid comparison"}}); 
     } 

     let key: string = CHelpers.getKey(name); 
     console.log("successfully filtered " + comparison); 
     return fulfill(CHelpers.filterCourses(courses, key, filterValue, comparison)); 

    }) 
} 
関連する問題