私はコールバック関数を使用する代わりに.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を書くためのファントムコードの使用のために使用してください。それは仕事を面倒にしました。
コールバック内でコールバックを作成する方法の提案が必要です。
:彼の答えにRSPによって提案されたが、今私はcatched、別のコールバックに送信したエラーを取得していますようCannot read property 'then' of undefined
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つの関数の単純な呼び出しは煩雑になります。
:
はそれについての詳細はこの回答を参照してください。未定義のときに呼び出すことができないcatchのエラーが発生しているので、私はさらに移動してください。私はこのエラーがよくあることを知っていて、インターネット上で多くの解決策を持っていますが、私は解決できません。助けていただければ幸いです。ありがとう。 – Simer
@Simerはこの問題を解決できましたか?私はあなたがそれをどのように修正したか興味があります。ありがとう – Oliver
@oliver私はちょうど別の関数に戻るwaybill_url.insertWaybillUrlをシフトしたので、.thenの後に他の関数を呼び出す必要はありません。これは当時の私の問題を解決しました。したがって、 "console.log( 'PDFを生成しました');"コールバック(null、true)のみを書きました。 申し訳ありませんが、このエラーに対する明確な解決策が見つかりませんでしたが、その理由がわかりませんでした。 – Simer