私はNodeをかなり使い慣れていて、私はそれを使って外部APIを呼び出すいくつかのFirebase Cloud関数を書いています。私は約束に苦しんでいます。私はコールバックを使用する方法を知っていますが、私はコールバックを約束に変換する方法を理解することはできません。 newJobRequestSubmitted
メソッドで約束を利用したいので、ネストされたコールバックがありません。私はまた、最終的なリターン・ステートメントに達する前に関数が終了する場所を持っているという問題を解決することを願っています。ここではメソッドと呼ばれているメソッドの実装がある...コールバックを約束に変換する正しい方法
更新日:
exports.newJobRequestSubmitted = functions.database.ref('/job-requests').onWrite(event => {
if (event.data.val() === null) return null;
const agilecrmContactRef = event.data.ref.root.child('contacts');
return createWIWJobSite(jobSiteDescription, fullname, jobSiteAddress).then(jobsSiteResult => {
return Promise.all([
createCRMDeal(agilecrmContactRef, type, numEmployees, startTime.getTime(), address, fullname, estimatedCost),
createWIWShift(notes, utcStartTime, utcEndTime, numEmployees, jobsSiteResult.site.id).then(result => {
const userJobRequestsRef = event.data.adminRef.root.child('job-requests-by-user').child(userId).child(firebaseJobId);
return Promise.all([
userJobRequestsRef.set({type: type, jobDate: jobDate, wheniworkJobId: result.shift.id, status: 'pending'}),
]).then(_ => true);
}).catch(err=> {
return Promise.all([
event.data.ref.set(null)
]).then(_ => true);
})
]).then(_ => true);
}).catch(err=> {
console.log('ERROR = ', err);
});
});
var createCRMDeal = function(contactRef){
const crm = new CRMManager(...);
return agilecrmContactRef.once('value').then(snapshot=> {
const deal = {
...
};
return crm.contactAPI.createDeal(deal, function(result) {
console.log('succes creating deal = ', result);
}, function(err){
console.log('err creating deal = ', err);
});
});
};
var createWIWJobSite = function(){
const wiw = new WIW(...);
return wiw.post('sites', {
"location_id": 3795651,
});
};
var createWIWShift = function(jobSiteId){
const wiw = new WIW(...);
return wiw.post('shifts', {
"site_id": jobSiteId,
});
};
'wiwAPICreateJobSite'は' callback'パラメータを取ってはいけません。 '.post(...)'がすでにあなたに与えることを約束する 'return'だけです! – Bergi
上記のコードを提案して更新しました。しかし、私は約束を一緒に結ぶ方法を理解することができないので、私は上記のようにネストされていません...あなたが非常に感謝する例を示すことができたら – MikeG
あなたのコードに問題のあるネスティングはありません。単一エレメント配列に対して 'Promise.all'を使用することは避けたいかもしれません。' .then(_ => true) 'を' [unnest](https://stackoverflow.com/a/22000931/1048572) 'コール、残りは本当に上手です。 – Bergi