2017-02-22 15 views
0

私はコールバック関数を使用する代わりに.thenを初めて使用しています。以下は(node:2684)UnhandledPromiseRejectionWarning:未処理の約束拒否(却下ID:1):TypeError:未定義のプロパティ 'then'を読み取ることができません

私のコードスニペットです:

phantom.create().then(function (ph) { 
    ph.createPage().then(function (page) { 
     page.open("http://codebeautify.org/xmlvalidator").then(function (status) { 
      page.render(base_pdf_path + lpnumber + '.pdf').then(function() { 
       console.log('PDF generated for waybill'); 
       //Insert waybill url in db. 
       return waybill_url.insertWaybillUrl('Lpsimer', waybillUrl).then(function (waybill_inserted_resp) { 
        callback(null, true); 
       }).catch(function (error) { 
        callback(err_waybill_inserted); 
       }); 
      }); 
     }); 
    }); 
}); 

上記の機能は以下の通りである関数を呼び出し、これは別のファイルであり、適切にファイル名と呼ばれているwaybill.jsです:

var mongoose = require('mongoose'); 
var q = require('promised-io/promise'); 

var WaybillUrlSchema = new mongoose.Schema({ 
    lpnumber: String, 
    url: String, 
    waybilltime: Date 
}); 

module.exports = { 

    insertWaybillUrl: function (lpnumber, url) { 
     var defer = q.defer(); 
     var waybill_insert = new waybill_url({ 
      lpnumber: lpnumber, 
      url: url, 
      waybilltime: new Date() 
     }); 

     //Save model to MongoDB 
     waybill_insert.save(function (err, inserted_waybill) { 
      if (err) { 
       return defer.reject(err); 
      } 
      else { 
       return defer.resolve(inserted_waybill); 
      } 
     }); 
    } 
}; 

以前はこのパターンを使用してコールバックを作成していましたが、うまくいきました。

waybill_url.insertWaybillUrl('Lpsimer', waybillUrl, function(err, success) { 
    if (err) { 

    } else { 

    } 
)} 

PDFを書くためのファントムコードの使用のために使用してください。それは仕事を面倒にしました。

コールバック内でコールバックを作成する方法の提案が必要です。

Cannot read property 'then' of undefined

:彼の答えにRSPによって提案されたが、今私はcatched、別のコールバックに送信したエラーを取得していますよう

phantom.create().then(function (ph) { 

    ph.createPage().then(function (page) { 

     page.open("http://codebeautify.org/xmlvalidator").then(function (status) { 
      page.render(base_pdf_path + lpnumber + '.pdf').then(function() { 

       //Insert waybill url in db. 

       waybill_url.insertWaybillUrl('Lpsimer', waybillUrl).then(function (waybill_inserted_resp) { 

        if (waybill_inserted_resp) { 

         callback(null, true); 

        } 

       }).catch(function (error_waybill_url_insert) { 

        console.log("Error in inserting waybill:" + err_waybill_inserted); 

        callback(error_waybill_url_insert); 
       }); 

      }).catch(function (error_render) { 

       console.log("error_render"); 
       callback(error_render); 
      }); 

     }).catch(function (error_open) { 

      callback(error_open); 

     }); 

    }).catch(function (error_create_page) { 

     callback(error_create_page); 

    }); 

}).catch(function (error_phantom_create) { 

    callback(error_phantom_create); 
}); 

UPDATEは、今、私はその後、すべてのためのキャッチを追加しました

console.log( "error_render")を追加したところでこのエラーが発生しています。 私はここでファントムのpage.render関数を呼び出しています。

私の要件は簡単です。ファントムを使ってPDFファイルを生成したいのですが、別のファイルwaybill_urlにある別の関数を呼び出すだけです。関数名:waybill_url.insertWaybillUrl。しかし、コールバックと非同期の振る舞いのために、この2つの関数の単純な呼び出しは煩雑になります。

答えて

3

catch()を使用し、then()またはthen()の2つの引数だけでなく、必ず使用してください。さもなければ、あなたはエラーを処理せず、あなたはその警告を得るでしょう - ノードの次のバージョンでは、警告ではなくエラーになります。私は、更新を行った

+0

はそれについての詳細はこの回答を参照してください。未定義のときに呼び出すことができないcatchのエラーが発生しているので、私はさらに移動してください。私はこのエラーがよくあることを知っていて、インターネット上で多くの解決策を持っていますが、私は解決できません。助けていただければ幸いです。ありがとう。 – Simer

+0

@Simerはこの問題を解決できましたか?私はあなたがそれをどのように修正したか興味があります。ありがとう – Oliver

+0

@oliver私はちょうど別の関数に戻るwaybill_url.insertWaybillUrlをシフトしたので、.thenの後に他の関数を呼び出す必要はありません。これは当時の私の問題を解決しました。したがって、 "console.log( 'PDFを生成しました');"コールバック(null、true)のみを書きました。 申し訳ありませんが、このエラーに対する明確な解決策が見つかりませんでしたが、その理由がわかりませんでした。 – Simer

関連する問題